java8 list 转map_Java8-Stream集合操作快速上手

作者:我是你的小眼睛来源:https://www.jianshu.com/p/9fe8632d0bc2

目录

  • Stream简介
  • 为什么要使用Stream
  • 实例数据源
  • Filter
  • Map
  • FlatMap
  • Reduce
  • Collect
  • Optional
  • 并发
  • 调试

Stream简介

  • Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。
  • stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。
  • 只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

为什么要使用Stream

  • 函数式编程带来的好处尤为明显。这种代码更多地表达了业务逻辑的意图,而不是它的实现机制。易读的代码也易于维护、更可靠、更不容易出错。
  • 高端

实例数据源

1479cb0a9bb4fddc610c153ce6242c94.png

Filter

  • 遍历数据并检查其中的元素时使用。
  • filter接受一个函数作为参数,该函数用Lambda表达式表示。
6289afc2c9bfe102181d2b44ddce59c2.png
 /** * 过滤所有的男性 */ public static void fiterSex(){ List data = Data.getData(); //old List temp=new ArrayList<>(); for (PersonModel person:data) { if ("男".equals(person.getSex())){ temp.add(person); } } System.out.println(temp); //new List collect = data .stream() .filter(person -> "男".equals(person.getSex())) .collect(toList()); System.out.println(collect); } /** * 过滤所有的男性 并且小于20岁 */ public static void fiterSexAndAge(){ List data = Data.getData(); //old List temp=new ArrayList<>(); for (PersonModel person:data) { if ("男".equals(person.getSex())&&person.getAge()<20){ temp.add(person); } } //new 1 List collect = data .stream() .filter(person -> { if ("男".equals(person.getSex())&&person.getAge()<20){ return true; } return false; }) .collect(toList()); //new 2 List collect1 = data .stream() .filter(person -> ("男".equals(person.getSex())&&person.getAge()<20)) .collect(toList()); }

Map

  • map生成的是个一对一映射,for的作用
  • 比较常用
  • 而且很简单
db10ad85a4d3d4d8c22065fae18faf2f.png
/** * 取出所有的用户名字 */ public static void getUserNameList(){ List data = Data.getData(); //old List list=new ArrayList<>(); for (PersonModel persion:data) { list.add(persion.getName()); } System.out.println(list); //new 1 List collect = data.stream().map(person -> person.getName()).collect(toList()); System.out.println(collect); //new 2 List collect1 = data.stream().map(PersonModel::getName).collect(toList()); System.out.println(collect1); //new 3 List collect2 = data.stream().map(person -> { System.out.println(person.getName()); return person.getName(); }).collect(toList()); }

FlatMap

顾名思义,跟map差不多,更深层次的操作,但还是有区别的

map和flat返回值不同

Map 每个输入元素,都按照规则转换成为另外一个元素。

还有一些场景,是一对多映射关系的,这时需要 flatMap。

  • Map一对一
  • Flatmap一对多

map和flatMap的方法声明是不一样的

  • Stream map(Function mapper);
  • Stream flatMap(Function> mapper);

map和flatMap的区别:我个人认为,flatMap的可以处理更深层次的数据,入参为多个list,结果可以返回为一个list,而map是一对一的,入参是多个list,结果返回必须是多个list。通俗的说,如果入参都是对象,那么flatMap可以操作对象里面的对象,而map只能操作第一层。

02fb1b7642a0a48f4edfacd917dc5789.png
public static void flatMapString() { List data = Data.getData(); //返回类型不一样 List collect = data.stream() .flatMap(person -> Arrays.stream(person.getName().split(" "))).collect(toList()); List> collect1 = data.stream() .map(person -> Arrays.stream(person.getName().split(" "))).collect(toList()); //用map实现 List collect2 = data.stream() .map(person -> person.getName().split(" ")) .flatMap(Arrays::stream).collect(toList()); //另一种方式 List collect3 = data.stream() .map(person -> person.getName().split(" ")) .flatMap(str -> Arrays.asList(str).stream()).collect(toList()); }

Reduce

  • 感觉类似递归
  • 数字(字符串)累加
  • 个人没咋用过
e6c727cb73311602b83fb6fe2d88d892.png
public static void reduceTest(){ //累加,初始化值是 10 Integer reduce = Stream.of(1, 2, 3, 4) .reduce(10, (count, item) ->{ System.out.println("count:"+count); System.out.println("item:"+item); return count + item; } ); System.out.println(reduce); Integer reduce1 = Stream.of(1, 2, 3, 4) .reduce(0, (x, y) -> x + y); System.out.println(reduce1); String reduce2 = Stream.of("1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值