Java流式编程

jdk8流式编程

介绍 :Stream是jdk8的新特性,JDK8加入 了java.util.stream包,实现了集合的流式操作,流式操作包括集合的过滤,排序,映射等功能。根据流的操作性,又可以分为 串行流 和 并行流。根据操作返回的结果不同,流式操作又分为中间操作和最终操作。大大方便了我们对于集合的操作。

1.什么是流:

Stream 不是 集合元素,也不是数据结构,它相当于一个 高级版本的 Iterator,不可以重复遍历里面的数据,像水一样,流过了就一去不复返。它和普通的 Iterator 不同的是,它可以并行遍历,普通的 Iterator 只能是串行,在一个线程中执行。

2.生成流

Stream生成
集合: Collection接口中的stream() / parallelStream()方法
数组: Arrays.stream(Object[]);
静态方法 :Stream.of(Object[]), IntStream.range(int, int),Stream.iterate(Object, UnaryOperator)
文件:BufferedReader.lines()
随机数: Random.ints()
其他: BitSet.stream(), Pattern.splitAsStream(java.lang.CharSequence), JarFile.stream()

3.对流操作
  • 中间操作:
    filter(): 对元素进行过滤
    sorted():对元素排序
    map():元素映射
    distinct():去除重复的元素
  • 最终操作:
    forEach():遍历每个元素。
    reduce():把Stream 元素组合起来。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。
    collect():返回一个新的集合。
    min():找到最小值。
    max():找到最大值。
4.代码帮助理解

public static void main(String[] args) {
   List<String> list = new ArrayList();
   list.add("a");
   list.add("b");
   list.add("c");
   list.add("d");
   list.add("d");
   list.add("d");
   list.add("d");
   list.add("d");
   list.add("d");
   list.add("e");
   list.add("f");
   list.add("aa");
   list.add("faaa");
   System.out.println("----对集合数据的过滤,根据给到的条件筛选过滤----");
   list.stream().filter(param -> !param.contains("a")).forEach(System.out::println);

   System.out.println("----对集合数据进行排序,默认的是升序排列----");
   list.stream().sorted().forEach(System.out::println);

   System.out.println("----自定义排序方式----");//注:这里是通过 Stream<T> sorted(Comparator<? super T> comparator); 这个方法
   list.stream().sorted((p1,p2) -> p1.hashCode() <p2.hashCode() ? 1 : -1).forEach(System.out::println);

   System.out.println("----对于集合的每个元素可以按照规则变成相应的元素,这里是把包含a的元素替换成了1,其他的不变----");
   list.stream().map(param -> param.contains("a") ? 1 : param).forEach(System.out ::println);

   System.out.println("----对于集合中重复的数据进行去重,把相同的数据去除,这里去除了d的重复元素----");
   list.stream().distinct().forEach(System.out ::println);

   System.out.println("----reduce是把集合里的数据组合起来,这里是把所有的元素组合成一个新的字符串----");
   System.out.println(list.stream().reduce((p1,p2) -> p1+p2).get());
  
   System.out.println("----collect是将原先的集合数据根据给定的条件筛选重新生成一个新的list集合返回----");
   list.stream().filter(p -> !p.contains("a")).collect(Collectors.toList()).forEach(System.out::println);
}

List<User> userlist =Lists.asList(new User(1,"zz",20)),new User(2,"aa",3));
userlist .stream() .collect(Collectors.toMap(UserBo::getUserId, v -> v, (v1, v2) -> v1));
第一个参数UserBo::getUserId 表示选择UserBo的getUserId作为map的key值;
第二个参数v -> v表示选择将原来的对象作为map的value值;
第三个参数(v1, v2) -> v1中,如果v1与v2的key值相同,选择v1作为那个key所对应的value值。


直接用这个userlist .stream().coletion(Collectors.groupingBy(UserBo::geUserId))
可获取 Map<Long, List<UserBo>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值