java8集合操作

2019/09/16

java8集合操作

list集合操作

list字符串集合操作
     List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
     
     计算空字符串的数量
     long count = strings.stream().filter(string->string.isEmpty()).count();
     
     字符串长度为 3 的数量
     long count = strings.stream().filter(string -> string.length() == 3).count();
     
     筛选后的列表
     List<String> filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
    
     筛选后合并字符串
     mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
    
     List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
     
     去重后平方
     List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
     System.out.println("Squares List: " + squaresList);
    
     获取集合中maxmin,sum,avg
     IntSummaryStatistics stats = numbers.stream().mapToInt((x) ->x).summaryStatistics();
    
     System.out.println("列表中最大的数 : " + stats.getMax());
     System.out.println("列表中最小的数 : " + stats.getMin());
     System.out.println("所有数之和 : " + stats.getSum());
     System.out.println("平均数 : " + stats.getAverage());
    列表: [abc, , bc, efg, abcd, , jkl]
    空字符串数量为: 2
    字符串长度为 3 的数量为: 3
    筛选后的列表: [abc, bc, efg, abcd, jkl]
    筛选后合并字符串: abc, bc, efg, abcd, jkl
    Squares List: [9, 4, 49, 25]
    列表: [3, 2, 2, 3, 7, 3, 5]
    列表中最大的数 : 7
    列表中最小的数 : 2
    所有数之和 : 25
    平均数 : 3.5714285714285716
list对象集合操作

    filter使用过滤
    将list中的Student按年龄大于等于15的,升序排列
    调用compare中的排序方法comparing自然排序
    List<Student> student1 = list.stream().filter(x -> x.getAge() >= 20).sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
    System.out.println("list中的Student按年龄大于等于20的升序排列:"+student1.toString());
    
    将list中的Student年龄小于15的,降序排列
    调用Integer中的compare方法
    List<Student> student2 = list.stream().filter(x -> x.getAge() < 14).sorted((s1, s2) -> Integer.compare(s2.getAge(), s1.getAge())).collect(Collectors.toList());
    System.out.println("list中的Student年龄小于15的降序排列:"+student2.toString());
    
    将list中的Student年龄小于15的,并且生日降序排列
    List<Student> student3 = resultList.stream().filter(x -> x.getAge() < 14).
                        sorted(Comparator.comparing(Student::getBirthday,(s1, s2) -> {
                            return s2.compareTo(s1);
                        })).collect(Collectors.toList());
    
    计算list中年龄小于16的元素的个数
    统计功能一般都是结合filter使用因为先筛选出我们需要的再统计即可
    long count = list.stream().filter(x -> x.getAge() < 16).count();
    System.out.println("ist中年龄小于16的元素的个数:"+count);
    
    map使用提取单列数据集合map将对象转换为其他对象
    取出每个人的年龄,加1后返回成List
    List<Integer> list2 = list.stream().map(x -> x.getAge()).map(i -> i + 1).collect(Collectors.toList());
    System.out.println("每个人的年龄加1后返回成List:"+list2.toString());
    
    获取List中每个人的名字,返回成一个List
    List<String> collect = list.stream().map(x -> x.getName()).collect(Collectors.toList());
    List<String> collect2 = list.stream().map(Student::getName).collect(Collectors.toList());
    List<String> collect3 = list.stream().map(item -> {
    	return item.getName();
    }).collect(Collectors.toList());
    System.out.println("每个人的名字返回一个list集合:"+collect.toString());
    
    扩展返回的name集合拼接成字符串
    String collect = students.stream().map(item -> item.getName()).collect(Collectors.joining(","));//以,拼接name
    结果张三,李四王五
    String names = students.stream().map(Student::getName).collect(Collectors.joining(",","[","]"));//第一个是分界符,第二个是前缀符,第三个是结束符
    结果[张三,李四王五]
    
    成绩和年龄之和返回一个list集合
    List<Integer> integers = list.stream().map(student -> {
        return student.getGrade() + student.getAge();
    }).collect(Collectors.toList());
    System.out.println("绩和年龄之和返回一个list集合:"+integers.toString());
    
    计算list中年龄之和
    //Optional allsum = list.stream().map(Student::getAge).reduce((x, y) -> x + y);
    Optional allsum = list.stream().map(Student::getAge).reduce(Integer::sum);
    System.out.println("计算list中年龄之和"+ allsum.get());
    方式二
    age若为一般类型Integer
    此方式保证age属性全部有值,不可为null
    //Integer ages = list.stream().mapToInt(Student::getAge).sum();
    此方式age属性可以为null
    Integer ages = list.stream().mapToInt(n -> n.getAge() == null ? 0 : n.getAge()).sum();
    方式三
    Integer reduce = list.stream().parallel().map(Student::getAge).reduce(0, Integer::sum);
    Integer reduce = list.stream().parallel().map(n -> n.getAge() == null ? 0 : n.getAge()).reduce(0, Integer::sum);
    
    查看每一个学生占的分值比重
    Integer ages = list.stream().mapToInt(Student::getAge).sum();
    List<String> collect = list.stream()
                .mapToDouble(s -> s.getGrade() % grades)
                .mapToLong(weight -> (long) (weight * 1))
                .mapToObj(percentage -> percentage + "%")
                .collect(Collectors.toList());
     System.out.println("查看每一个学生占的分值比重"+ collect.toString());
     
    计算list中大于16的人的年龄之和
    Optional sum = list.stream().filter(x -> x.getAge() > 16).map(x -> x.getAge()).reduce((x, y) -> x + y);
    System.out.println("计算list中大于16的人的年龄之和"+sum.get());
    
    将list中大于16的人的年龄各减1,再计算他们的年龄之和
    int sum2 = list.stream().filter(x -> x.getAge() > 16).map(x -> x.getAge() - 1).reduce(0, (x, y) -> x + y);
    System.out.println("list中大于16的人的年龄各减1再计算他们的年龄之和:"+sum2);
    
    方式一返回最大年龄和最小年龄
    Optional o1 = list.stream().map(x -> x.getAge()).max((x, y) -> Integer.compare(x, y));
    System.out.println("返回最大年龄:"+o1.get());
    o1 = list.stream().map(x -> x.getAge()).max((x, y) -> Integer.compare(y, x));
    System.out.println("返回最小年龄:"+o1.get());
    
    方式二集合中计算最大年龄和最小年龄
    //Optional o2 = list.stream().map(x -> x.getAge()).reduce((x, y) -> Integer.max(x, y));
    Optional o2 = list.stream().map(x -> x.getAge()).reduce(Integer::max);
    System.out.println("返回最大年龄:"+o2.get());
    o2 = list.stream().map(x -> x.getAge()).reduce(Integer::min);// 使用了Integer中的min方法
    System.out.print("返回最小年龄:"+o2.get());
    
    方式三集合中计算最大年龄和最小年龄
    maxmin接收一个Comparator例子中使用java8自带的静态函数只需要传进需要比较值即可。)并且返回一个Optional对象该对象是java8新增的类专门为了防止null引发的空指针异常
    可以使用max.isPresent()判断是否有值可以使用max.orElse(new Student())当值为null时就使用给定值也可以使用max.orElseGet(() -> new Student());这需要传入一个Supplier的lambda表达式
     
    Optional<Student> max = list.stream().max(Comparator.comparing(x -> x.getAge()));
    Optional<Student> min = list.stream().min(Comparator.comparing(x -> x.getAge()));
    //判断是否有值
    if (max.isPresent()) {//集合不为空,里面有Student对象
        System.out.println("返回最大年龄:"+max.get());
    }else{//集合为空
        
    }
    
    if (min.isPresent()) {
        System.out.println("返回最小年龄:"+min.get());
    }
    
    获取list集合中平均年龄
    Double avgAge = list.stream().collect(averagingInt(Student::getAge));
    list中的Student按年龄大于等于20的升序排列:[Student{age=20, grade=91, name='rr'}, Student{age=21, grade=86, name='pp'}, Student{age=34, grade=44, name='pp'}]
    list中的Student年龄小于15的降序排列:[Student{age=13, grade=74, name='kk'}, Student{age=12, grade=88, name='aa'}, Student{age=12, grade=52, name='ff'}]
    ist中年龄小于16的元素的个数:4
    每个人的年龄加1后返回成List:[13, 18, 15, 13, 17, 14, 19, 21, 20, 22, 35]
    每个人的名字返回一个list集合:[aa, cc, bb, ff, ss, kk, nn, rr, ww, pp, pp]
    绩和年龄之和返回一个list集合:[100, 116, 99, 64, 108, 87, 71, 111, 98, 107, 78]
    计算list中年龄之和196
    查看每一个学生占的分值比重[88%, 99%, 85%, 52%, 92%, 74%, 53%, 91%, 79%, 86%, 44%]
    计算list中大于16的人的年龄之和129
    list中大于16的人的年龄各减1再计算他们的年龄之和:123
    返回最大年龄:34
    返回最小年龄:12
    返回最大年龄:34
    返回最小年龄:12
    返回最大年龄:34
    返回最小年龄:12
stream的 count,anyMatch,allMatch,noneMatch操作
    stream的 count,anyMatch,allMatch,noneMatch操作,我们先看下函数的定义
    long count();  
    boolean anyMatch(Predicate<? super T> predicate);  
    boolean allMatch(Predicate<? super T> predicate);  
    boolean noneMatch(Predicate<? super T> predicate);
    count方法,跟List接口的size一样,返回的都是这个集合流的元素的长度,不同的是,流是集合的一个高级工厂,中间操作是工厂里的每一道工序,我们对这个流操作完成后,可以进行元素的数量的和;
    anyMatch表示,判断的条件里,任意一个元素成功,返回true
    allMatch表示,判断条件里的元素,所有的都是,返回true
    noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true
字符串集合
    List<String> list = Arrays.asList("张三", "李四", "王五", "马六9");
    long count = list.stream().filter(m -> m.length() == 2).count();
    boolean allMatch = list.stream().allMatch(m -> m.equals("张三"));
    boolean allMatch1 = list.stream().allMatch(m -> m.length() == 2); // 长度是否都等于2
    //count = 3
    //allMatch = false
    //allMatch1 = false
    
    boolean anyMatch = list.stream().anyMatch(m -> m.equals("张三"));
    boolean anyMatch1 = list.stream().anyMatch(m -> m.equals("张0"));
    //anyMatch = true
    //anyMatch1 = false
    
    boolean noneMatch = list.stream().noneMatch(m -> m.equals("张三"));
    boolean noneMatch1 = list.stream().noneMatch(m -> m.equals("张0"));
    //noneMatch = false
    //noneMatch1 = true
    //字符串拼接
    String str[] = {"A", "B", "C", "D"};
    String concat = Arrays.stream(str).reduce("", String::concat);
    //concat: ABCD
对象集合
    List<Student> students = Student.generate();
    boolean b = students.stream().anyMatch(m -> m.getAge() > 15);


扫码加好友

(转载本站文章请注明作者和出处 追梦er