概念

流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作。

特点

  • tream 自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
  • Stream 操作是延迟执行的,会等到需要结果的时候才执行。

使用

创建:

  • 新建一个流。

中间操作:

  • 在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。

终止操作:

  • 使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该Stream就不能使用了。

创建方式:

  • 通过Collection对象的stream()或parallelStream()方法。
  • 通过Arrays类的stream()方法。
  • 通过Stream接口的of()、iterate()、generate()方法。
  • 通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。
    创建
 List<String> list=new ArrayList<>();list.add("111");list.add("222");list.add("33");//获取stream对象1Stream<String> stream = list.stream();stream.forEach(System.out::println);//获取stream对象2Stream<String> stringStream = Stream.of("222", "444", "555");stringStream.forEach(System.out::println);

中间操作:

//中间操作//filter 过滤 传入参数是一个断言型接口 获取集合中长度大于2的元素list.stream().filter(s -> s.length() > 2).forEach(System.out::println);//limit 和mysql的limit相似 获取集合的前1条数据list.stream().limit(1).forEach(System.out::println);//distinct  去重list.stream().distinct().forEach(System.out::println);//sorted 排序 传入一个比较器 和list的sort方法相似 将集合元素按长度从小到大排序list.stream().sorted((o1,o2)->o1.length()-o2.length());//map   传入一个函数型接口 将集合中的元素全部转换成Int型list.stream().map(Integer::parseInt).forEach(System.out::println);//parallel  使用多线程操作集合中的元素list.stream().parallel().forEach((s)->{System.out.println(Thread.currentThread().getName()+" "+s);});

终止操作:

 //终止操作//min 获取集合中最小元素  最小的判断是按照比较器来的 就是输出经过比较器排序后的第一个元素Optional<String> min = list.stream().min((o1, o2) -> {return o1.length() - o2.length();});System.out.println(min.get());//max 获取集合中最大元素 与min机制相同 是输出最后一个Optional<String> max = list.stream().max((o1, o2) -> {return o1.length() - o2.length();});System.out.println(max.get());//count 计数  获取长度为3的元素的个数long count = list.stream().filter(s -> s.length() == 3).count();System.out.println(count);//reduce  将元素转换为int并求和list.stream().map(Integer::parseInt).reduce(0,(o1,o2)->o1+o2);//collect 将stream流对象转换为List Set Map集合   将流转换为listList<String> collect = list.stream().collect(Collectors.toList());collect.forEach(System.out::println);

常见函数式接口

  1. Consumer 消费型接口 参数为T 返回void ;
    void accept(T t)对类型为T的对象应用操作
public class MyConsumer {public static void test(String str, Consumer<String> consumer){consumer.accept(str);}public static void main(String[] args) {MyConsumer.test("hello",str-> System.out.println(str));test("hello",System.out::println);}
}
  1. Supplier 供给型接口
    参数无 返回值为T
    T get();返回类型为T的对象
public class MySupplier {public static void main(String[] args) {System.out.println(test(() -> {return "hello";}));}public static String test(Supplier<String> supplier){return supplier.get();}
}

3.Function<T,R>函数型接口
参数T 返回值R
R apply(T t) 对类型为T的对象应用操作,并返回类型为R类型的对象

public class MyFunction {public static void main(String[] args) {System.out.println(test("hello", str -> {return str;}));}public static String test(String s, Function<String,String> f){return f.apply(s);}
}

4.Predicate 断言型接口
参数T 返回值boolean
boolean test(T t);确定类型为T的对象是否满足条件 满足返回true

public class Predicate {public static void main(String[] args) {System.out.println(test("hello", str -> {return "hello".equals(str);}));}public static boolean test(String s, java.util.function.Predicate<String> p){return p.test(s);}
}

Java -Stream流和常见函数式接口相关推荐

  1. comparator接口_8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理

    我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  2. java——Stream流

    创建不可变集合 什么是不可变集合 不可变集合,就是不可以被修改的集合. 集合的数据项在创建的时候提供,并且在整个生命周期都不可改变.否则报错 为什么要创建不可变集合 如果某个数不能被修改,把他预防性的 ...

  3. java Stream 流

    java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...

  4. 测试Java Stream流 parralle与 sequential的效率

    测试Java Stream流 parralle与 sequential的效率 实验环境 操作系统:win10 处理器:Intel i5-4200U 2核4线程 Java版本:1.8 实验方案 统计大小 ...

  5. Java stream流式计算详解

    Java stream流式计算详解 1. Stream概述 1.1 Stream简介 1.2 Stream分类 2. Stream操作 2.1 Stream创建 2.2 Stream无状态操作 2.3 ...

  6. Java Stream流基础

    Java Stream流基础 何为Steam流? Stream 是对集合数组对象功能的增强,其专注于对集合数组对象进行各种非常便利.高效的聚合操作,或者大批量数据操作.通常我们需要多行代码才能完成的操 ...

  7. Java 内置核心四大函数式接口

    在java.util.function包内 , 有Java 内置核心四大函数式接口,可以使用lambda表达式 1.函数型接口(有一个输入,有一个输出) public class Demo1 {pub ...

  8. Java Stream流之求和

    Java Stream流之求和 流方式实现 基本数据类型 和 包装类型 的一位数组求和 package top.yangbocsu;import java.util.Arrays;/*** @auth ...

  9. Java 8 Stream流的常见操作

    Stream流的使用 在 Java 8 中, 集合接口有两个方法来生成流: stream() − 为集合创建串行流.parallelStream() − 为集合创建并行流. 串行流 如果是数组的话,可 ...

最新文章

  1. zabbix专题:第十一章 zabbix之SNMP方式监控
  2. python PyQt5.QtWidgets.QWidget.mouseMoveEvent()函数
  3. QT-第一个程序 Hello QT , 以及QT creator介绍
  4. 自己动手写js分享插件 [支持https] (QQ空间,微信,新浪微博。。。)
  5. python 坐标连线_从具有和角度的坐标绘制线 - python
  6. 常用的基本Windows数据类型
  7. 提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类
  8. 树莓派ROS配置指南
  9. 新浪博客登录php发,PHP的万能密码登陆
  10. Linux 动态链接和静态链接简析(库名与库文件名)
  11. 关于编码问题,报错:'gbk' codec can't encode character '\u3164' in position 0: illegal multibyte sequence...
  12. 将函数储存在模块中(2)
  13. php 调用永中云,永中优云:是时候给大家介绍真正的云端Office了
  14. es like模糊匹配_Elastic search模糊匹配,精确匹配显示在前
  15. python程序设计与算法基础教程微课版课后答案_Python程序设计与算法基础教程
  16. 锐捷S12010交换机配置端口镜像
  17. 计算机键盘上的句号键在哪,电脑键盘句号是哪个键
  18. 【用于图像修复、数据增强等】结合官方代码教程,在Windows 10下运行pix2pix-tensorflow(tensorflow==1.4.0 python=3.6)
  19. Linux- rsync企业级实战
  20. 智能优化算法期末复习

热门文章

  1. Qt的rcc资源,换肤或新皮肤发布
  2. intel QPI 频率问题
  3. 生产报工软件怎么选?一定要看这几点,值得收藏!
  4. 剪辑视频软件哪个好?快来试试这几个方法
  5. 自然语言处理及计算语言学相关术语中英对译表(A~L)
  6. SQL Server 2012 express edition Silent installation
  7. MYsql 性能监控工具
  8. 4轮字节面试后杳无音信,自己是在了备胎池了吗?感觉我的面试要凉了呀!
  9. 天载股票资讯A股遭到商场各大利空音讯影响
  10. 如何将微信聊天记录转移到其他手机上