zoukankan      html  css  js  c++  java
  • lambda表达式,stream、filter、collect、set、limit、findFirst、Map、mapToInt、Distinct、sort、sorted、assertEquals

    要使用lambda表达式,必须装1.8以上的Java版本(包括1.8)
    一 stream(流)
    1 通过filter过滤掉不满足条件的属性值(普通类型)
    显示list集合中不是bb的所有值

    public class FirstClass {
    @Test
    public void test() {
        List<String> list=new ArrayList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");
        list.stream().filter(s -> null!=s&&!"bb".equals(s))
                .forEach(s -> System.out.println(s));
    }
    }

    在这里插入图片描述
    .filter(条件表达式,就是判断语句)
    .forEach(要循环的值),.forEach中的变量已经是过滤之后的了
    2 通过.filter过滤引用类型,获取姓名不是aa对象的年龄

    public class FirstClass {
    @Test
    public void test() {
    Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        list.stream().filter(p ->!p.getName().equals("aa"))
                .forEach(p->{ System.out.println(p.getAge()); } );
    }
    }

    在这里插入图片描述
    3 若是只想做一下过滤,不想输出,需要把过滤结果给其他人使用,怎么办?
    .collect 是将.filter过滤完成的结果转为一个新的集合,需要用变量接收

    import lombok.Data;
    @Data
    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        List list1=list.stream().filter(p ->!p.getName().equals("aa"))
        .collect(Collectors.toList());
        for(int i=0;i<list1.size();i++){
            System.out.println(list1.get(i));
        }
    }
    }

    在这里插入图片描述
    4 set集合也可以用.collect接收过滤后的结果

    import lombok.Data;
    @Data
    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        Set<Person> set=new HashSet<>();
        set.add(person);
        set.add(person1);
        set.add(person2);
        Set  set1=set.stream().filter(p ->!p.getName().equals("aa"))
        .collect(Collectors.toSet());
        Iterator iterator=set1.iterator();
        while (iterator.hasNext()){
            Person s=(Person) iterator.next();
            System.out.println(s.getName());
        }
    }
    }

    在这里插入图片描述
    5 其实特性
    limit 例:List.stream().limit(2)返回前两个集合

    import lombok.Data;
    @Data
    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        list.stream().limit(2).forEach(f->{
            System.out.println(f);
        });
    }
    }

    在这里插入图片描述
    6 count 例:List.stream().count()返回长度大小,与list.size()一个功能

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        long a=list.stream().count();
        System.out.println(a);
    }
    }

    在这里插入图片描述
    7 findFirst 例:Optional p=list.stream().findFirst();返回集合中的第一个对象要用Optional接收,写入泛型类型

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        Optional<Person> p=list.stream().findFirst();
        System.out.println(p);
    }
    }

    在这里插入图片描述

    8 Map就是将某个List内容转换成Map
    例把两个人的年龄放到一个新的List里,map里的语法叫函数式接口
    语法(引用类型::方法名),就是遍历引用类型Person类,调用getName方法,将获取到的name放在一个新的集合list1里

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        List list1=list.stream().map(Person::getName).collect(Collectors.toList());
        for(int i=0;i<list1.size();i++){
            System.out.println(list1.get(i));
        }
    }
    }

    在这里插入图片描述
    9 将List集合里的对象年龄相加,mapToInt(Person::getAge),还可以mapToDouble还可mapToIong

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("bb");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("cc");
        person2.setAge(12);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        int ageSum=list.stream().mapToInt(Person::getAge).sum();
            System.out.println(ageSum);
    }
    }

    在这里插入图片描述

    map里要是一般值,不是对象怎么取值,直接get(“Key”)就好
    @org.testng.annotations.Test
    public void mapTest(){
        List<Map<String,String>> mapList=new ArrayList<>();
        Map<String,String> map =new HashMap<>();
        map.put("userName","aa" );
        map.put("age","十岁" );
        map.put("sex","女" );
        Map<String,String> map1 =new HashMap<>();
        map1.put("userName","bb" );
        map1.put("age","九岁" );
        map1.put("sex","男" );
        mapList.add(map);
        mapList.add(map1);
        List<Map<String,String>> mapList1=mapList.stream().
                filter(m ->m.get("userName").
                        equalsIgnoreCase("bb")).
                collect(Collectors.toList());
        for (Map m:mapList1){
            System.out.println(m);
        }
    }

    在这里插入图片描述
    10 去重
    Distinct:将多个相同内容只保留一个,与set相似,相同元素,只保留一个;据说对象去重要重写HashCode,但是下面这段代码并没有重写HashCode也实现了对象去重

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("aa");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("aa");
        person1.setAge(10);
        Person person2 = new Person();
        person2.setName("aa");
        person2.setAge(10);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        list.stream().distinct().forEach(p->{
            System.out.println(p);
        } );
    }
    }

    在这里插入图片描述
    11 对象排序方法1
    对象排序要指定一个属性,因为对象中有很多个属性(例如:name、age、sex…),并不知道要用哪个属性排序
    (Person p1,Person p2)指定的属性p1和p2是两两对比,调用的就是排序方法,排序用的是ASCII码表顺序作为排序依据

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("bb");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("zz");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("xx");
        person2.setAge(12);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
        list.sort((Person p1,Person p2) ->p1.getName().compareTo(p2.getName()));
        list.forEach(p-> {
            System.out.println(p.getName());
        });
    }
    }

    在这里插入图片描述
    **12 对象排序方法2(返序)

    list.stream().sorted(Comparator.comparing(Person::getName));
        list.forEach(p-> {
            System.out.println(p.getName());
        });
        输出的还是bb  zz  xx  那就是没有排,name用.stream()的方式干什么呢?返序
    在.sorted()后面加上.reversed()做返序排序;返序完成之后是一个新的流,要用一个变量接收(看清楚,是List list 是Person不是String),才能用forEach打印,或者在当前流直接forEach**
    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("bb");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("zz");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("xx");
        person2.setAge(12);
        List<Person> list=new ArrayList();
        list.add(person);
        list.add(person1);
        list.add(person2);
         list.stream().sorted(Comparator.comparing(Person::getName).reversed()).forEach(s ->{
             System.out.println(s.getName());
         });
    }
    }

    在这里插入图片描述
    13 如何将对象存入map里,从map里取出?

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("bb");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("zz");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("xx");
        person2.setAge(12);
        Map<String,Person> map=new HashMap<>();
        map.put("AA",person );
        map.put("BB",person1 );
        map.put("CC",person2 );
        Person p=map.get("AA");
        System.out.println(p.getName());
    }
    }

    在这里插入图片描述
    14 如果我们不知道key的时候要获取name=bb这个对象的age,要怎么做?
    对于map而言有一个约定,key用字符串存储,在lambda操作map里的值用数组保存

    public class Person {
    private int age;
    private String name;
    }
    
    
    import org.junit.Test;
    import java.util.*;
    import java.util.stream.Collectors;
    public class FirstClass {
    @Test
    public void test() {
        Person person = new Person();
        person.setName("bb");
        person.setAge(10);
        Person person1 = new Person();
        person1.setName("zz");
        person1.setAge(11);
        Person person2 = new Person();
        person2.setName("xx");
        person2.setAge(12);
        Map<String,Person> map=new HashMap<>();
        map.put("AA",person );
        map.put("BB",person1 );
        map.put("CC",person2 );
        map.forEach((k,v) ->{
            if(v.getName().equals("bb")){
                System.out.println(v.getAge());
            }
        });
    }
    }

    在这里插入图片描述
    15 在lambda表达式中操作Map里对象的值用数组保存
    有3个老师,每个老师有2个属性:name、course,每个老师的姓名,所授课程不同,根据输入的课程判断该课程对应的老师是否与预期相同
    1.Teacher 类

    import lombok.Data;
    @Data
    public class Teacher {
     String name;
     String coures;
    }

    老师1继承Teacher 类

    public class Xiaohu extends Teacher {
        public Xiaohu(String name,String coures){
        this.name=name;
        this.coures=coures;
    }
    }

    老师2继承Teacher类

    public class Xiaoli extends Teacher {
        public Xiaoli(String name,String coures){
        this.name=name;
        this.coures=coures;
    }
    }

    老师3继承Teacher类

    public class Xiaowanzi extends Teacher{
        public Xiaowanzi(String name,String coures){
        this.name=name;
        this.coures=coures;
    }
    }

    业务类:实例化老师,做逻辑判断,获取的teacher的名字用数组接收,要先定义一个数组

    import org.junit.Test;
    import java.util.HashMap;
    import java.util.Map;
    import static org.junit.Assert.*;
    public class TeacherTest {
    public String teacherTest(String coures){
        Xiaoli xiaoli=new Xiaoli("xiaoli","java");
        Xiaohu xiaohu=new Xiaohu("xiaohu","APP");
        Xiaowanzi xiaowanzi=new Xiaowanzi("xiaowanzi","seleium");
        Map<String,Teacher> teacherMap =new HashMap<>();
        teacherMap.put("xiaoli", xiaoli);
        teacherMap.put("xiaohu",xiaohu);
        teacherMap.put("xiaowanzi", xiaowanzi);
        String [] name=new String[1];
        teacherMap.forEach((k,v) ->{
            if(v.getCoures().equals(coures)){
                name[0]=v.getName(); }});
        return name[0];
    }
    测试类,做检查点
    
    @Test
    public void test(){
        String name=teacherTest("java");
        assertEquals("校验老师名字","xiaoli" ,name);
    }
    }
    
    assertEquals引import static org.junit.Assert.*;包,别引错包,第一个参数是输出文案,第二个参数是预期结果,第三个参数是实际结果
  • 相关阅读:
    linux下安装MongoDB
    Prometheus+Grafana企业监控系统
    微服务项目运维管理
    Jenkins CI&CD 自动化发布项目实战(上篇)
    Docker入门与进阶(下)
    Docker入门与进阶(上)
    Git&Gitlab开发流程与运维管理
    报名中|面基啦~首站深圳线下云原生技术开放日来了
    kubernetes 降本增效标准指南| 容器化计算资源利用率现象剖析
    使用 Velero 跨云平台迁移集群资源到 TKE
  • 原文地址:https://www.cnblogs.com/yszr/p/14286378.html
Copyright © 2011-2022 走看看