March21Sunny - Stream
type: channel
link: https://jianz.xyz/index.php/tag/Stream/
items: Java8 Stream 使用

Java8 Stream 使用
type: item
date: 2020-12-04T17:11:00+00:00
description: filter（过滤）该操作n的函数，当返回false的元素将会被排除掉。举例：假如我们100个客户，需要筛选出年龄大于18岁的客户。 List<SysUser> collect = userList.stream() .filter(user -> user.getAge() > 18) .collect(Collectors.toList());去重distinct该操作将会排除掉重复的元素。 List<SysUser> collect = userList.stream() .distinct() .collect(Collectors.toList());也可结合别的方法使用。如下：去掉集合中大于5的重复值。List<Integer> collect = Stream.of(1, 2, 5, 6, 7, 8, 9, 7, 2) .filter(num -> num > 5) .distinct() .collect(Collectors.toList());输出：[6, 7, 8, 9]使用 collectingAndThen() 和 toCollection() 方法这个方法可以根据元素的某个属性或者多个属性来去重，比如 name 或者 name+address。这个方法会使用 TreeSet 来排序元素，所以不能保持原来的顺序。//根据name属性去重 List<User> lt = list.stream().collect( collectingAndThen( toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new) ); System.out.println("去重后的:" + lt);MapList<KnowledgeQuest> distinctList = knowledgeQuestList.stream() .collect(Collectors.toMap( KnowledgeQuest::getKnowkey, // 使用 knowkey 作为 Map 的键 Function.identity(), // 使用 KnowledgeQuest 对象自身作为值 (existing, replacement) -> replacement)) // 如果出现重复的 knowkey，用新值替换旧值 .values() .stream() .collect(Collectors.toList());limit（限量）该方法限制流只返回指定个数的元素。List<Integer> collect = Stream.of(1, 2, 5, 6, 7, 8, 9, 7, 2) .limit(5) .collect(Collectors.toList());输出：[1, 2, 5, 6, 7]skip（跳过）扔掉前指定个数的元素；配合limit使用可以达到翻页的效果。List<Integer> collect = Stream.of(1, 2, 5, 6, 7, 8, 9, 7, 2) .skip(2) .limit(5) .collect(Collectors.toList());输出：[5, 6, 7, 8, 9]map该方法提供一个函数，流中的每个元素都会应用到这个函数上，返回的结果将形成新类型的流继续后续操作。 将一个元素映射成一个新的元素。举例：假如我们100个客户，需要筛选出年龄大于18岁的客户，打印出他们的名字userList.stream().filter(user-> user.getRoleId()>18).map(SysUser::getName).forEach(System.out::println);相当于for (SysUser sysUser : userList) { if (sysUser.getAge() > 18) { String name = sysUser.getName(); System.out.println(name); } }在调用map之前流的类型是Stream，执行完map之后的类型是Stream。过滤并获取名字列表List<String> userNameList = userList.stream().filter(user-> user.getRoleId()>18).map(SysUser::getName)..collect(Collectors.toList());获取Id和名字的mapMap<Long, String> userIdNameMap = userList.stream().collect(Collectors.t…