zoukankan      html  css  js  c++  java
  • JAVA8——Stream()

      Stream API常用方法:

        

                                                                           Stream操作分类
    中间操作 无状态 unordered() filter() map() mapToInt() mapToLong() mapToDouble() flatMap() flatMapToInt() flatMapToLong() flatMapToDouble() peek()
    有状态 distinct() sorted() boxed() limit() skip()
    结束操作 非短路操作 forEach() forEachOrdered() toArray() reduce() collect() max() min() count()
    短路操作 anyMatch() allMatch() noneMatch() findFirst() findAny()

      

    常用中间件

          filter:过滤流,过滤流中的元素,返回一个符合条件的Stream

          map:转换流,将一种类型的流转换为另外一种流。(mapToInt、mapToLong、mapToDouble 返回int、long、double基本类型对应的Stream)

          flatMap:简单的说,就是一个或多个流合并成一个新流。(flatMapToInt、flatMapToLong、flatMapToDouble 返回对应的IntStream、LongStream、DoubleStream流。)

          distinct:返回去重的Stream。

          sorted:返回一个排序的Stream。

          peek:主要用来查看流中元素的数据状态。

          limit:返回前n个元素数据组成的Stream。属于短路操作

          skip:返回第n个元素后面数据组成的Stream。 

        boxed: 将LongStream、IntStream、DoubleStream转换成对应类型的Stream<T>

    结束操作

      forEach: 循环操作Stream中数据。

      toArray: 返回流中元素对应的数组对象。

      reduce: 聚合操作,用来做统计。

      collect: 聚合操作,封装目标数据。

      min、max、count: 聚合操作,最小值,最大值,总数量。

      anyMatch: 短路操作,有一个符合条件返回true。

      allMatch: 所有数据都符合条件返回true。

      noneMatch: 所有数据都不符合条件返回true。

      findFirst: 短路操作,获取第一个元素。

      findAny: 短路操作,获取任一元素。

      forEachOrdered: 暗元素顺序执行循环操作。

    举例说明

    @Data
    public class Person {
        
        private Integer  id;
        
        private String name;
        
        private String sex;
        
        private Integer age;
        
    }

    map中间件例子

    public class TestMap {
    
        public static void main(String[] args) {
            List<Person> persionList = new ArrayList<Person>();
            persionList.add(new Person(1,"小陈","男",38));
            persionList.add(new Person(2,"小小","女",2));
            persionList.add(new Person(3,"小李","男",65));
            persionList.add(new Person(4,"小王","女",20));
            persionList.add(new Person(5,"小童","男",38));
            persionList.add(new Person(6,"小刘","男",65));
    
            //1、只取出该集合中所有姓名组成一个新集合
            List<String> nameList=persionList.stream().map(Person::getName).collect(Collectors.toList());
            System.out.println(nameList.toString());
    
            //2、只取出该集合中所有id组成一个新集合
            List<Integer> idList=persionList.stream().mapToInt(Person::getId).boxed().collect(Collectors.toList());
            System.out.println(idList.toString());
    
            //3、list转map,key值为id,value为Person对象
            Map<Integer, Person> personmap = persionList.stream().collect(Collectors.toMap(Person::getId, person -> person));
            System.out.println(personmap.toString());
    
            //4、list转map,key值为id,value为name
            Map<Integer, String> namemap = persionList.stream().collect(Collectors.toMap(Person::getId, Person::getName));
            System.out.println(namemap.toString());
    
            //5、进行map集合存放,key为age值 value为Person对象 它会把相同age的对象放到一个集合中
            Map<Integer, List<Person>> ageMap = persionList.stream().collect(Collectors.groupingBy(Person::getAge));
            System.out.println(ageMap.toString());
    
            //6、获取最小年龄
            Integer ageMin = persionList.stream().mapToInt(Person::getAge).min().getAsInt();
            System.out.println("最小年龄为: "+ageMin);
    
            //7、获取最大年龄
            Integer ageMax = persionList.stream().mapToInt(Person::getAge).max().getAsInt();
            System.out.println("最大年龄为: "+ageMax);
    
            //8、集合年龄属性求和
            Integer ageAmount = persionList.stream().mapToInt(Person::getAge).sum();
            System.out.println("年龄总和为: "+ageAmount);
            
        }
    }

     filter相关

    public class TestFilter {
    
        public static void main(String[] args) {
            List<Person> persionList = new ArrayList<Person>();
            persionList.add(new Person(1, "张三", "男", 8));
            persionList.add(new Person(2, "小小", "女", 2));
            persionList.add(new Person(3, "李四", "男", 25));
            persionList.add(new Person(4, "王五", "女", 8));
            persionList.add(new Person(5, "赵六", "女", 25));
            persionList.add(new Person(6, "大大", "男", 65));
    
            //1、查找年龄大于20岁的人数
            long  age=persionList.stream().filter(p->p.getAge()>20).count();
            System.out.println(age);
    
            //2、查找年龄大于20岁,性别为男的人数
           List<Person>  ageList=persionList.stream().filter(p->p.getAge()>20).filter(p->"男".equals(p.getSex())).collect(Collectors.toList());
            System.out.println(ageList.size());
        
        Map<String, List<Person>> stringListMap =persionList.stream()
                                  .filter(s -> s.getAge()>=25).collect(Collectors.groupingBy(Person::getSex(), Collectors.toList()));

    }

    sorted相关

    //数组相关
    public
    class TestSort { String[] arr1 = {"abc","a","bc","abcd"}; /** * 按照字符长度排序 */ @Test public void testSorted1_(){ Arrays.stream(arr1).sorted(Comparator.comparing(String::length)).forEach(System.out::println); //输出:a、bc、abc、abcd } /** * 倒序 * reversed(),java8泛型推导的问题,所以如果comparing里面是非方法引用的lambda表达式就没办法直接使用reversed() * Comparator.reverseOrder():也是用于翻转顺序,用于比较对象(Stream里面的类型必须是可比较的) * Comparator. naturalOrder():返回一个自然排序比较器,用于比较对象(Stream里面的类型必须是可比较的) */ @Test public void testSorted2_(){ Arrays.stream(arr1).sorted(Comparator.comparing(String::length).reversed()).forEach(System.out::println); //输出:abcd、abc、bc、a Arrays.stream(arr1).sorted(Comparator.reverseOrder()).forEach(System.out::println); //输出:bc、abcd、abc、a Arrays.stream(arr1).sorted(Comparator.naturalOrder()).forEach(System.out::println); //输出:a、abc、abcd、bc } /** * 先按照首字母排序 * 之后按照String的长度排序 */ @Test public void testSorted3_(){ Arrays.stream(arr1).sorted(Comparator.comparing(this::com1).thenComparing(String::length)).forEach(System.out::println); } //输出:a、abc、abcd、bc public char com1(String x){ return x.charAt(0); } }
    //集合相关
    public
    class TestSort { public static void main(String[] args) { List<Person> persionList = new ArrayList<Person>(); persionList.add(new Person(1, "张三", "男", 8)); persionList.add(new Person(2, "小小", "女", 2)); persionList.add(new Person(3, "李四", "男", 25)); persionList.add(new Person(4, "王五", "女", 8)); persionList.add(new Person(5, "赵六", "女", 25)); persionList.add(new Person(6, "大大", "男", 65)); //1、找到年龄最小的岁数 Collections.sort(persionList, (x, y) -> x.getAge().compareTo(y.getAge())); Integer age = persionList.get(0).getAge(); System.out.println("年龄最小的有:" + age); //输出:年龄最小的有:2 //2、找到年龄最小的姓名 String name = persionList.stream() .sorted(Comparator.comparingInt(x -> x.getAge())) .findFirst() .get().getName(); System.out.println("年龄最小的姓名:" + name); //输出:年龄最小的姓名:小小 } }
    时光静好,与君语;细水长流,与君同;繁华落尽,与君老!
  • 相关阅读:
    wireshark: no interface can be used for capturing in this system
    git上传者姓名修改
    将照片转成base64时候,使用下面的这个包更加安全一些
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    gson之将对象转化成json字符串的方法
    微信之获取微信的openid(二)详细版
    微信支付之获取openid
    后台返回的Json为null的字段不显示的方法
    如果在使用谷歌的gson的时候,在返回时间类型的数据的时候,
    Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.qingmu.seller.entity.OrderMaster
  • 原文地址:https://www.cnblogs.com/lyzj/p/13541909.html
Copyright © 2011-2022 走看看