大家好,欢迎来到IT知识分享网。
了解和剖析
/题目 * 现在有5个用户,进行筛选 * 1、ID必须是偶数 * 2、年龄必须大于23岁 * 3、用户名转为大写字母 * 4、用户名字母倒着排序 * 5、只输出一个用户 */ public class Test01 { public static void main(String[] args) { User u1 = new User(1, "a", 21); User u2 = new User(2, "b", 28); User u3 = new User(3, "c", 25); User u4 = new User(4, "d", 56); User u5 = new User(5, "e", 25); //把这些对象存储进一个集合中 List<User> list = Arrays.asList(u1, u2, u3, u4, u5); //链式编程,计算交给Stream流,把集合转换成一个Stream流对象 list.stream().filter((u)->{return u.getId()%2 == 0;}) .filter((u)->{return u.getAge() > 23;}) .map((u)->{return u.getName().toUpperCase();}) //转大写 .sorted((uu1,uu2)->{return uu2.compareTo(uu1);}) //倒序 .limit(1) .forEach(System.out::println); } }
创建流
流的创建,分成了单列和双列类型,创建流的方式如下
//单列集合创建流 List<Map<String, Object>> birthdayData = null; Stream<Map<String, Object>> stream = birthdayData.stream(); //单列数组创建流(两种方法) Integer[] arr = {1,2,3}; Stream<Integer> stream1 = Arrays.stream(arr); Stream<Integer> stream2 = Stream.of(arr); //双列Map集合创建流(Map集合不能直接创建Stream流,需要先转换成单列集合) Map<Object, Object> hashMap = new HashMap<>(); hashMap.put("start_date", nowDateStr); hashMap.put("end_date", nowDateStr); hashMap.put("calendar_search", searchText); Set<Map.Entry<Object, Object>> entrySet = hashMap.entrySet(); Stream<Map.Entry<Object, Object>> mapStream = entrySet.stream();
中间操作
filter
map
//初始化数据 CalendarFuzzyVo vo1 = new CalendarFuzzyVo(); CalendarFuzzyVo vo2 = new CalendarFuzzyVo(); CalendarFuzzyVo vo3 = new CalendarFuzzyVo(); List<CalendarFuzzyVo> list = new ArrayList<>(); list.add(vo1); list.add(vo2); list.add(vo3); list.stream() .map(new Function<CalendarFuzzyVo, String>() { @Override public String apply(CalendarFuzzyVo calendarFuzzyVo) { //拿到对象中的日程ID并返回 return calendarFuzzyVo.getSchedule_id(); } }) .forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } });
2、Lambda表达式方式(简化后)
//初始化数据 CalendarFuzzyVo vo1 = new CalendarFuzzyVo(); CalendarFuzzyVo vo2 = new CalendarFuzzyVo(); CalendarFuzzyVo vo3 = new CalendarFuzzyVo(); List<CalendarFuzzyVo> list = new ArrayList<>(); list.add(vo1); list.add(vo2); list.add(vo3); list.stream() .map(calendarFuzzyVo -> calendarFuzzyVo.getSchedule_id()) .forEach(s -> System.out.println(s));
(二)计算
distinct
使用流来去重
sorted
二、实现原理
这个方法的方法体中只需要传入需要比较的属性,两个属性相减,如果为前面的大,就是正的;如果前面的小,就是负的;如果为0,则说明两个对象的年龄是相等的(注意:无需记忆该方法是升序还是降序,只需要根据需求调换减号两边参数的位置)
2、如果调用带参的sorted方法,直接在调该方法的时候,使用匿名内部类的方式进行重写compare方法
limit
三、示例
代码:
控制台:打印出1个元素
skip
flatMap
三、示例
peek
二、使用示例
终结操作
forEach
count
min&max
collect
2、获取所有书名的Set集合
调用Collectors.toSet方法
4、根据单一字段分组
查找与匹配anyMatch
查找与匹配allMatch
二、示例
查找与匹配noneMatch
二、示例
查找与匹配findAny
这里需要注意的是,可能通过过滤的工作后,压根就不存在符合条件的作家对象,那么这个时候需要调用Optional的ifPresent方法,避免出现空指针的情况
查找与匹配findFirst
reduce
二、工作原理
其中identity就是我们可以通过方法参数传入的初始值,accumlator的apply具体进行什么计算就要看方法体中怎么写
该方法会把stream中的元素组合起来,可以传入一个初始值,他会按照我们的计算方式依次拿流中的元素和在初始化值的基础上进行计算,计算结果再和后面的元素计算
需要注意的是,如果我们想求一个对象中Integer类型数据的和,那么首先需要通过map将流的泛型转换成Integer类型,才能调用reduce方法,赋予Integer类型的初始值(identity)
2、求最大值
3、求最小值
至此,关于Stream中常见的操作介绍完毕,内容比较多,建议收藏反复学习,后续还会持续更新,敬请期待~~~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/123049.html