Java8Stream流

打印 上一主题 下一主题

主题 515|帖子 515|积分 1545

Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以今天打算系统的过一下,再巩固巩固。
概念

Stream是JDK8 API中的新成员,它允许以声明性方式处理集合。
流程

1、把集合转换为流Stream
2、操作Stream流
Stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
一些常见的中间操作和中止操作


  • 中间操作(过滤、映射、限制...),可以多个
方法名方法作用返回值类型方法类型filter过滤Stream中间操作map映射(转换)接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素Stream中间操作peek窥探Stream中间操作skip跳过前几个Stream中间操作limit截取前几个Stream中间操作distinct去重操作(比较的是地址)Stream中间操作sorted排序操作Stream中间操作

  • 终止操作(最常见的是收集),只可以设置1个
方法名方法作用返回值类型方法类型collect收集处理结果泛型终止操作count统计个数long终止操作forEach逐一处理void终止操作reduce汇总操作Optional  该对象有get方法可以获取返回值终止操作Stream的3个注意事项:

  • Stream中间操作方法返回的是新的流
  • Stream不调用终结方法,中间的操作不会执行
  • Stream只能调用一次终止操作。得到结果后,不能再次使用这个流。
下面是一些小demo

点击查看代码
  1. /**
  2.      * 过滤集合中不符合条件的元素
  3.      */
  4.     @Test
  5.     public void testfilter(){
  6.         List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
  7.         List<String> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
  8.         aList.forEach(System.err::println);
  9.     }
  10.     /**
  11.      *去重
  12.      */
  13.     @Test
  14.     public void testDistinct(){
  15.         List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
  16.         List<String> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
  17.         distinctStr.forEach(System.out::println);
  18.         //--------------------------------
  19.         Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
  20.         Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
  21.         Product prod3 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
  22.         ArrayList<Product> proList = Lists.newArrayList(prod1, prod2, prod3);
  23.         List<Product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
  24.         distinctProList.forEach(System.out::println);
  25.     }
  26.     /**
  27.      * limit(n)获取流中的前n个元素
  28.      */
  29.     @Test
  30.     public void testLimit(){
  31.         List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
  32.         List<String> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
  33.         System.out.println(limitStr);
  34.     }
  35.     /**
  36.      * skip(n)
  37.      */
  38.     @Test
  39.     public void testSkip(){
  40.         List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
  41.         List<String> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
  42.         System.out.println(skipStrList);
  43.     }
  44.     /**
  45.      * map() 接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素
  46.      */
  47.     @Test
  48.     public void testMap(){
  49.         List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
  50.         List<String> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
  51.         System.out.println(mapStrList);
  52.     }
  53.     @Test
  54.     public void testSorted(){
  55.         List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
  56.         List<String> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
  57.         System.out.println(sortedStrList);
  58.     }
  59.     /**
  60.      * collect():将流转换为其他形式 list set map
  61.      */
  62.     @Test
  63.     public void testCollect(){
  64.         List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
  65.         Set<String> collectSet = stringList.stream().collect(Collectors.toSet());
  66.         System.out.println(collectSet);
  67.     }
  68.     /**
  69.      * 将流中元素反复结合起来得到一个结果
  70.      */
  71.     @Test
  72.     public void testReduce(){
  73.         List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
  74.         Optional<String> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
  75.         if (reduce.isPresent()) System.out.println(reduce.get());
  76.     }
  77.     /**
  78.      * 将流中元素反复结合起来得到一个结果
  79.      */
  80.     @Test
  81.     public void testCount(){
  82.         List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
  83.         long count = stringList.stream().count();
  84.         System.out.println(count);
  85.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表