• JDK8 Stream测试


    如何创建一个流Stream,三种方法:测试

    1、通过 java.util.Collection.stream()

    2、通过数组来创建流

    3、静态方法:使用Stream的静态方法:of()、iterate()、generate()

    1. public class StreamJ {
    2. public static void main(String[] args){
    3. // getOfStream();
    4. getDusk();
    5. }
    6. public void anyMatch(){
    7. List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
    8. boolean b = strings.stream().anyMatch(s -> s == "abc");
    9. System.out.println(b);
    10. }
    11. //创建一个空流
    12. public static void getDusk(){
    13. Stream<String> ao=Stream.empty();
    14. //创建无限流,通过limit提取指定大小
    15. //随机产生20个数字,是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n
    16. Stream.generate(()->"number"+new Random().nextInt()).limit(20).forEach(System.out::println);
    17. //创建20个Student
    18. Stream.generate(()->new Student("name",10)).limit(20).forEach(System.out::println);
    19. }
    20. //通过 java.util.Collection.stream() 方法用集合创建流
    21. public static void getStream(){
    22. List<String> sl= Arrays.asList("a","b","c","d");
    23. //创建一个顺序流
    24. Stream<String> sortD=sl.stream();
    25. //创建一个并行流
    26. Stream<String> parallelStream=sl.parallelStream();
    27. }
    28. //通过数组来创建流
    29. public static void getArrayStream(){
    30. int[] arr={1,2,3,4,5};
    31. IntStream inStream= Arrays.stream(arr);
    32. }
    33. //使用Stream的静态方法:of()、iterate()、generate()
    34. public static void getOfStream(){
    35. Stream<Integer> instream=Stream.of(1,2,3,4,5);
    36. //指定一个常量seed,生成从seed到常量f的流(1,2,3,4,5)
    37. Stream<Integer> insreamt=Stream.iterate(0,(a)->a+1).limit(6);
    38. insreamt.forEach(System.out::println);
    39. //一下俩种写法输出是一样的UnaryOperator.identity()是Java8的一元运算符,输入是什么,输出就是什么
    40. Stream.iterate(0,x->x).limit(10).forEach(System.out::println);
    41. Stream.iterate(0, UnaryOperator.identity()).limit(10).forEach(System.out::println);
    42. //下面是对循环的写法
    43. Stream.iterate(0,(a)->a+1).limit(6).forEach(a->{
    44. System.out.print(a +"\n");
    45. });
    46. Stream<Double> dStream=Stream.generate(Math::random).limit(5);
    47. dStream.forEach(System.out::println);
    48. //以上代码等同于
    49. DoubleStream intStream = DoubleStream.generate(()
    50. -> { return (int)(Math.random()); });
    51. intStream.limit(5).forEach(System.out::println);
    52. }
    53. static class Student{
    54. private String name;
    55. private int age;
    56. public Student(String name, int age) {
    57. this.name = name;
    58. this.age = age;
    59. }
    60. public int getAge() {
    61. return age;
    62. }
    63. public void setAge(int age) {
    64. this.age = age;
    65. }
    66. public String getName() {
    67. return name;
    68. }
    69. public void setName(String name) {
    70. this.name = name;
    71. }
    72. }
    73. }

    以下几点需要注意:

    lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion
     把 x -> System.out.println(x) 简化为 System.out::println 的过程称之为 eta-conversion
    
    把 System.out::println 简化为 x -> System.out.println(x) 的过程称之为 eta-expansion
    
    范式:
    类名::方法名
    方法调用
    person -> person.getAge();
    可以替换成
    Person::getAge
    
    x -> System.out.println(x)
    可以替换成
    System.out::println
    out是一个PrintStream类的对象,println是该类的方法,依据x的类型来重载方法
    
    创建对象
    () -> new ArrayList<>();
    可以替换为
    ArrayList::new
    new关键字实际上调用的是ArrayList的构造方法

     

    //描述:一元运算,接受一个T类型参数,输出一个与入参一模一样的值
    System.out.println(UnaryOperator.identity().apply(10));     // 10
    System.out.println(UnaryOperator.identity().apply(10.01));  // 10.01
    System.out.println(UnaryOperator.identity().apply(false));  // false
    System.out.println(UnaryOperator.identity().apply("10"));   // 10
    
    UnaryOperator b = x->x.intValue();  // lambda表达式,这样就只能输入Integer类型了
    
    System.out.println(b.apply(10));

    流多种形式:

    1. //创建普通流
    2. Stream<String> stream = strs.stream();
    3. //创建并行流
    4. Stream<String> stream1 = strs.parallelStream();
    5. //创建一个空的stream
    6. Stream<Integer> stream = Stream.empty();
    7. //创建无限流,通过limit提取指定大小
    8. Stream.generate(()->"number"+new Random().nextInt()).limit(100).forEach(System.out::println);
    9. Stream.generate(()->new Student("name",10)).limit(20).forEach(System.out::println);
    10. Stream.iterate(0,x->x+1).limit(10).forEach(System.out::println);
    11. Stream.iterate(0,x->x).limit(10).forEach(System.out::println);
    12. //Stream.iterate(0,x->x).limit(10).forEach(System.out::println);与如下代码意思是一样的
    13. Stream.iterate(0, UnaryOperator.identity()).limit(10).forEach(System.out::println);

    基本数值型流: 

    1. IntStream
    2. LongStream
    3. DoubleStream

      当然我们也可以用 Stream、Stream >、Stream,但是 boxing 和 unboxing 会很耗时,所以特别为这三种基本数值型提供了对应的 Stream。

    基本数值型流:

    1. IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);
    2. IntStream.range(1, 3).forEach(System.out::println);
    3. IntStream.rangeClosed(1, 3).forEach(System.out::println);

    流转换为其它数据结构 :

    1. // 1. Array
    2. String[] strArray1 = stream.toArray(String[]::new);
    3. // 2. Collection
    4. List<String> list1 = stream.collect(Collectors.toList());
    5. List<String> list2 = stream.collect(Collectors.toCollection(ArrayList::new));
    6. Set set1 = stream.collect(Collectors.toSet());
    7. Stack stack1 = stream.collect(Collectors.toCollection(Stack::new));
    8. // 3. String
    9. String str = stream.collect(Collectors.joining()).toString();

    常见操作分类:

    当把一个数据结构包装成 Stream 后,就要开始对里面的元素进行各类操作了。常见的操作可以归类如下。注意:这些中间操作是惰性求值的,也就是说,只有在终止操作被调用时才开始执行。这种方式可以大大减少操作的开销,使得Stream的处理更加高效。

    • Intermediate(中间操作符):

      map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

    • Terminal(最终操作符):

      forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

    • Short-circuiting(对符合条件的流元素进行最终操作):

      anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

     实例:

    1. 1)filter
    2. /**
    3. * 功能描述:根据条件过滤集合数据
    4. * @return : void
    5. */
    6. @Test
    7. public void filter(){
    8. List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
    9. List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
    10. System.out.println(filtered);
    11. }
    12. 2)distinct
    13. /**
    14. * 功能描述:去除集合中重复数据
    15. * @return : void
    16. */
    17. @Test
    18. public void distinct(){
    19. List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
    20. List<String> distincted = strings.stream().distinct().collect(Collectors.toList());
    21. System.out.println(distincted);
    22. }
    23. 3limit
    24. /**
    25. * 功能描述:指定获取集合前x条数据,重新构造一个新的集合
    26. * @return : void
    27. */
    28. @Test
    29. public void limit(){
    30. List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
    31. List<String> limited = strings.stream().limit(3).collect(Collectors.toList());
    32. System.out.println(limited);
    33. }
    34. 4)skip
    35. /**
    36. * 功能描述:排除集合前x条数据,把后面的数据重新构造一个新的集合
    37. * @return : void
    38. */
    39. @Test
    40. public void skip(){
    41. List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
    42. List<String> skiped = strings.stream().skip(3).collect(Collectors.toList());
    43. System.out.println(skiped);
    44. }
    45. 5)map
    46. /**
    47. * 功能描述:对集合中所有元素统一处理
    48. * @return : void
    49. */
    50. @Test
    51. public void map(){
    52. List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
    53. List<String> mapped = strings.stream().map(str->str+"-itcast").collect(Collectors.toList());
    54. System.out.println(mapped);
    55. }
    56. 6)flatMap
    57. /**
    58. * 功能描述:对集合中所有元素统一处理
    59. * @return : void
    60. */
    61. @Test
    62. public void flatMap(){
    63. List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
    64. Stream<String> stringStream = strings.stream().map(x -> x);
    65. Stream<String> stringStream1 = strings.stream().flatMap(x -> Arrays.asList(x.split(" ")).stream());
    66. }
    67. 7)sorted
    68. /**
    69. * 功能描述 : 对集合进行排序
    70. * @return : void
    71. */
    72. @Test
    73. public void sorted(){
    74. List<String> strings1 = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
    75. List<String> strings2 = Arrays.asList("张三", "李四", "王五", "赵柳", "张哥","李哥", "王哥");
    76. List<Integer> strings3 = Arrays.asList(10, 2, 30, 22, 1,0, -9);
    77. List<String> sorted1 = strings1.stream().sorted().collect(Collectors.toList());
    78. List<String> sorted2 = strings2.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.CHINA))).collect(Collectors.toList());
    79. List<Integer> sorted3 = strings3.stream().sorted().collect(Collectors.toList());
    80. System.out.println(sorted1);
    81. System.out.println(sorted2);
    82. System.out.println(sorted3);
    83. }

    Map、flatMap区别

    map:对流中每一个元素进行处理
    flatMap:流扁平化,让你把一个流中的“每个值”都换成另一个流,然后把所有的流连接起来成为一个流
    总结:map是对一级元素进行操作,flatmap是对二级元素操作。
    本质区别:map返回一个值;flatmap返回一个流,多个值。

    应用场景:map对集合中每个元素加工,返回加工后结果;flatmap对集合中每个元素加工后,做扁平化处理后(拆分层级,放到同一层)然后返回

    1. /**
    2. * 方法一
    3. * 功能描述: 通过使用map、flatMap把字符串转换为字符输出对比区别
    4. * @return : void
    5. */
    6. @Test
    7. public void flatMap2Map(){
    8. List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
    9. final Stream<Character> flatMap = strings.stream().flatMap(Java8StreamTest::getCharacterByString);
    10. flatMap.forEach(System.out::println);
    11. //----------------------------------------------
    12. final Stream<Stream<Character>> mapStream = strings.stream().map(Java8StreamTest::getCharacterByString);
    13. //mapStream.forEach(System.out::println);
    14. System.out.println("------------------------------------------------");
    15. mapStream.forEach(stream-> {stream.forEach(character->{System.out.println(character);});});
    16. }
    17. 公共方法(字符串转换为字符流)
    18. /**
    19. * 功能描述:字符串转换为字符流
    20. * @param str
    21. * @return : java.util.stream.Stream<java.lang.Character>
    22. */
    23. public static Stream<Character> getCharacterByString(String str) {
    24. List<Character> characterList = new ArrayList<>();
    25. for (Character character : str.toCharArray()) {
    26. characterList.add(character);
    27. }
    28. return characterList.stream();
    29. }

     终止操作符:

    1. 1)anyMatch
    2. /**
    3. * 功能描述 : 判断集合中是否至少存在一个元素满足条件
    4. * @return : void
    5. */
    6. @Test
    7. public void anyMatch(){
    8. List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
    9. boolean b = strings.stream().anyMatch(s -> s == "abc");
    10. System.out.println(b);
    11. }
    12. 2)allMatch
    13. /**
    14. * 功能描述 : 判断集合中是否所有元素都满足条件
    15. * @return : void
    16. */
    17. @Test
    18. public void allMatch(){
    19. List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
    20. boolean b = strings.stream().allMatch(s -> s == "abc");
    21. System.out.println(b);
    22. }
    23. 3)noneMatch
    24. /**
    25. * 功能描述 : 判断集合中是否所有元素都不满足条件
    26. * @return : void
    27. */
    28. @Test
    29. public void noneMatch(){
    30. List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
    31. boolean b = strings.stream().noneMatch(s -> s == "abc");
    32. System.out.println(b);
    33. }
    34. 4)findAny
    35. /**
    36. * 功能描述 : 返回当前流中任意元素
    37. * @return : void
    38. */
    39. @Test
    40. public void findAny(){
    41. List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");
    42. Optional<String> any = strings.stream().findAny();
    43. if(any.isPresent()) out.println(any.get());
    44. }
    45. 5)findFirst
    46. /**
    47. * 功能描述 : 返回当前流中第一个元素
    48. * @return : void
    49. */
    50. @Test
    51. public void findFirst(){
    52. List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");
    53. Optional<String> first = strings.stream().findFirst();
    54. if(first.isPresent()) System.out.println(first.get());
    55. }
    56. 6)forEach java
    57. /**
    58. * 功能描述 : 遍历流
    59. * @return : void
    60. */
    61. @Test
    62. public void foreach(){
    63. List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");
    64. strings.stream().forEach(s -> System.out.println(s));
    65. }
    66. 7)collect
    67. /**
    68. * 功能描述 : 流转换为其他形式
    69. * @return : void
    70. */
    71. @Test
    72. public void collect(){
    73. List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");
    74. Set<String> set = strings.stream().collect(Collectors.toSet());
    75. List<String> list = strings.stream().collect(Collectors.toList());
    76. Map<String, String> map = strings.stream().collect(Collectors.toMap(v ->v.concat("_name"), v1 -> v1, (v1, v2) -> v1));
    77. System.out.println(set);
    78. System.out.println(list);
    79. System.out.println(map);
    80. }
    81. 8)reduce
    82. /**
    83. * 功能描述 : 将流中元素反复结合起来,得到一个值
    84. * @return : void
    85. */
    86. @Test
    87. public void reduce(){
    88. List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");
    89. //reduce方法一
    90. Optional<String> reduce1 = strings.stream().reduce((acc,item) -> {return acc+item;});
    91. //reduce方法二
    92. String reduce2 = strings.stream().reduce("itcast", (acc, item) -> {
    93. return acc + item;
    94. });
    95. //reduce方法三
    96. ArrayList<String> reduce3 = strings.stream().reduce(
    97. new ArrayList<String>(),
    98. new BiFunction<ArrayList<String>, String, ArrayList<String>>() {
    99. @Override
    100. public ArrayList<String> apply(ArrayList<String> acc, String item) {
    101. acc.add(item);
    102. return acc;
    103. }
    104. },
    105. new BinaryOperator<ArrayList<String>>() {
    106. @Override
    107. public ArrayList<String> apply(ArrayList<String> acc, ArrayList<String> item) {
    108. return acc;
    109. }
    110. }
    111. );
    112. if(reduce1.isPresent())out.println(reduce1.get());
    113. System.out.println(reduce2);
    114. System.out.println(reduce3);
    115. }
    116. 9count
    117. /**
    118. * 功能描述 : 返回流中元素总数
    119. * @return : void
    120. */
    121. @Test
    122. public void count(){
    123. List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");
    124. long count = strings.stream().count();
    125. System.out.println(count);
    126. }

    forEach

    forEach 方法接收一个 Lambda 表达式,然后在 Stream 的每一个元素上执行该表达式。

    1. // Java 8
    2. roster.stream()
    3. .filter(p -> p.getGender() == Person.Sex.MALE)
    4. .forEach(p -> System.out.println(p.getName()));
    5. // Pre-Java 8
    6. for (Person p : roster) {
    7. if (p.getGender() == Person.Sex.MALE) {
    8. System.out.println(p.getName());
    9. }
    10. }

    map/flatMap

    1. 转换成大写字母:
    2. List<String> output = wordList.stream().
    3. map(String::toUpperCase).
    4. collect(Collectors.toList());
    5. 输出平方数:
    6. List<Integer> nums = Arrays.asList(1, 2, 3, 4);
    7. List<Integer> squareNums = nums.stream().
    8. map(n -> n * n).
    9. collect(Collectors.toList());
    10. flatMap一对多:
    11. Stream<List<Integer>> inputStream = Stream.of(
    12. Arrays.asList(1),
    13. Arrays.asList(2, 3),
    14. Arrays.asList(4, 5, 6)
    15. );
    16. Stream<Integer> outputStream = inputStream.
    17. flatMap((childList) -> childList.stream());

    filter:

    1. 留下偶数:
    2. Integer[] sixNums = {1, 2, 3, 4, 5, 6};
    3. Integer[] evens =
    4. Stream.of(sixNums).filter(n -> n%2 == 0).toArray(Integer[]::new);
    5. 把单词挑出来:
    6. List<String> output = reader.lines().
    7. flatMap(line -> Stream.of(line.split(REGEXP))).
    8. filter(word -> word.length() > 0).
    9. collect(Collectors.toList());
    peek:不是一个最终操作,不会影响“哪些元素会流过”,所以十分适合在调试的时候,用来打印出流经管道的元素。forEach 不能修改自己包含的本地变量值,也不能用 break/return 之类的关键字提前结束循环。
    1. Stream.of("one", "two", "three", "four")
    2. .filter(e -> e.length() > 3)
    3. .peek(e -> System.out.println("Filtered value: " + e))
    4. .map(String::toUpperCase)
    5. .peek(e -> System.out.println("Mapped value: " + e))
    6. .collect(Collectors.toList());

    reduce:这个方法的主要作用是把 Stream 元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。从这个意义上说,字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce

    1. // 字符串连接,concat = "ABCD"
    2. String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat);
    3. // 求最小值,minValue = -3.0
    4. double minValue = Stream.of(-1.5, 1.0, -3.0, -2.0).reduce(Double.MAX_VALUE, Double::min);
    5. // 求和,sumValue = 10, 有起始值
    6. int sumValue = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);
    7. // 求和,sumValue = 10, 无起始值
    8. sumValue = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
    9. // 过滤,字符串连接,concat = "ace"
    10. concat = Stream.of("a", "B", "c", "D", "e", "F").
    11. filter(x -> x.compareTo("Z") > 0).
    12. reduce("", String::concat);

    sorted:对 Stream 的排序通过 sorted 进行,它比数组的排序更强之处在于你可以首先对 Stream 进行各类 map、filter、limit、skip 甚至 distinct 来减少元素数量后,再排序,这能帮助程序明显缩短执行时间。

    1. List<Person> persons = new ArrayList();
    2. for (int i = 1; i <= 5; i++) {
    3. Person person = new Person(i, "name" + i);
    4. persons.add(person);
    5. }
    6. List<Person> personList2 = persons.stream().limit(2).sorted((p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());
    7. System.out.println(personList2);

     min/max/distinct

    1. 找出字符最长的一行:
    2. BufferedReader br = new BufferedReader(new FileReader("c:\\SUService.log"));
    3. int longest = br.lines().
    4. mapToInt(String::length).
    5. max().
    6. getAsInt();
    7. br.close();
    8. System.out.println(longest);
    9. 用distinct找出全文的单词,转小写,并排序:
    10. List<String> words = br.lines().
    11. flatMap(line -> Stream.of(line.split(" "))).
    12. filter(word -> word.length() > 0).
    13. map(String::toLowerCase).
    14. distinct().
    15. sorted().
    16. collect(Collectors.toList());
    17. br.close();
    18. System.out.println(words);

    limit和skip

    1. 这是一个有 10000 个元素的 Stream,但在 short-circuiting 操作 limit 和 skip 的作用下,管道中 map 操作指定的 getName() 方法的执行次数为 limit 所限定的 10 次,而最终返回结果在跳过前 3 个元素后只有后面 7 个返回。
    2. public void testLimitAndSkip() {
    3. List<Person> persons = new ArrayList();
    4. for (int i = 1; i <= 10000; i++) {
    5. Person person = new Person(i, "name" + i);
    6. persons.add(person);
    7. }
    8. List<String> personList2 = persons.stream().
    9. map(Person::getName).limit(10).skip(3).collect(Collectors.toList());
    10. System.out.println(personList2);
    11. }
    12. private class Person {
    13. public int no;
    14. private String name;
    15. public Person (int no, String name) {
    16. this.no = no;
    17. this.name = name;
    18. }
    19. public String getName() {
    20. System.out.println(name);
    21. return name;
    22. }
    23. }

    Stream 有三个 match 方法,从语义上说:

    • allMatch:Stream 中全部元素符合传入的 predicate,返回 true
    • anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
    • noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

    它们都不是要遍历全部元素才能返回结果。例如 allMatch 只要一个元素不满足条件,就 skip 剩下的所有元素,返回 false。对清单 13 中的 Person 类稍做修改,加入一个 age 属性和 getAge 方法。

    1. List<Person> persons = new ArrayList();
    2. persons.add(new Person(1, "name" + 1, 10));
    3. persons.add(new Person(2, "name" + 2, 21));
    4. persons.add(new Person(3, "name" + 3, 34));
    5. persons.add(new Person(4, "name" + 4, 6));
    6. persons.add(new Person(5, "name" + 5, 55));
    7. boolean isAllAdult = persons.stream().
    8. allMatch(p -> p.getAge() > 18);
    9. System.out.println("All are adult? " + isAllAdult);
    10. boolean isThereAnyChild = persons.stream().
    11. anyMatch(p -> p.getAge() < 12);
    12. System.out.println("Any child? " + isThereAnyChild);

     

    Stream.generate

      通过实现 Supplier 接口,你可以自己来控制流的生成。

    1. Stream.generate(new PersonSupplier()).
    2. limit(10).
    3. forEach(p -> System.out.println(p.getName() + ", " + p.getAge()));
    4. private class PersonSupplier implements Supplier<Person> {
    5. private int index = 0;
    6. private Random random = new Random();
    7. @Override
    8. public Person get() {
    9. return new Person(index++, "StormTestUser" + index, random.nextInt(100));
    10. }
    11. }

     Collectors 来进行分组操作:

    groupingBy/partitioningBy

    1. 按照年龄进行分组:
    2. Map<Integer, List<Person>> personGroups = Stream.generate(new PersonSupplier()).
    3. limit(100).
    4. collect(Collectors.groupingBy(Person::getAge));
    5. Iterator it = personGroups.entrySet().iterator();
    6. while (it.hasNext()) {
    7. Map.Entry<Integer, List<Person>> persons = (Map.Entry) it.next();
    8. System.out.println("Age " + persons.getKey() + " = " + persons.getValue().size());
    9. }
    10. 按照未成年人和成年人归组:
    11. Map<Boolean, List<Person>> children = Stream.generate(new PersonSupplier()).
    12. limit(100).
    13. collect(Collectors.partitioningBy(p -> p.getAge() < 18));
    14. System.out.println("Children number: " + children.get(true).size());
    15. System.out.println("Adult number: " + children.get(false).size());

     

  • 相关阅读:
    【Gitee】生成与配置SSH公钥
    adb下载安装及使用教程
    spring boot + sql server大数据量批量新增
    Spring之事务管理
    [pytorch] 2D + 3D ResNet代码实现, 改写
    270_JSON_设置xxxValue为一个JSON对象类型且复制上一层value数据到xxxValue中
    NK-RTU980 USB bulk传输
    C语言--输入三角形的三边,输出三角形的面积
    C/S架构学习之使用epoll实现TCP特大型并发服务器
    读了很多书,学了很多语言,专业知识远超普通大众,程序员1024依然要送外卖
  • 原文地址:https://blog.csdn.net/chehec2010/article/details/133560547