Java -Stream流和常见函数式接口
概念
流(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);
常见函数式接口
- 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);}
}
- 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流和常见函数式接口相关推荐
- comparator接口_8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- java——Stream流
创建不可变集合 什么是不可变集合 不可变集合,就是不可以被修改的集合. 集合的数据项在创建的时候提供,并且在整个生命周期都不可改变.否则报错 为什么要创建不可变集合 如果某个数不能被修改,把他预防性的 ...
- java Stream 流
java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...
- 测试Java Stream流 parralle与 sequential的效率
测试Java Stream流 parralle与 sequential的效率 实验环境 操作系统:win10 处理器:Intel i5-4200U 2核4线程 Java版本:1.8 实验方案 统计大小 ...
- Java stream流式计算详解
Java stream流式计算详解 1. Stream概述 1.1 Stream简介 1.2 Stream分类 2. Stream操作 2.1 Stream创建 2.2 Stream无状态操作 2.3 ...
- Java Stream流基础
Java Stream流基础 何为Steam流? Stream 是对集合数组对象功能的增强,其专注于对集合数组对象进行各种非常便利.高效的聚合操作,或者大批量数据操作.通常我们需要多行代码才能完成的操 ...
- Java 内置核心四大函数式接口
在java.util.function包内 , 有Java 内置核心四大函数式接口,可以使用lambda表达式 1.函数型接口(有一个输入,有一个输出) public class Demo1 {pub ...
- Java Stream流之求和
Java Stream流之求和 流方式实现 基本数据类型 和 包装类型 的一位数组求和 package top.yangbocsu;import java.util.Arrays;/*** @auth ...
- Java 8 Stream流的常见操作
Stream流的使用 在 Java 8 中, 集合接口有两个方法来生成流: stream() − 为集合创建串行流.parallelStream() − 为集合创建并行流. 串行流 如果是数组的话,可 ...
最新文章
- zabbix专题:第十一章 zabbix之SNMP方式监控
- python PyQt5.QtWidgets.QWidget.mouseMoveEvent()函数
- QT-第一个程序 Hello QT , 以及QT creator介绍
- 自己动手写js分享插件 [支持https] (QQ空间,微信,新浪微博。。。)
- python 坐标连线_从具有和角度的坐标绘制线 - python
- 常用的基本Windows数据类型
- 提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类
- 树莓派ROS配置指南
- 新浪博客登录php发,PHP的万能密码登陆
- Linux 动态链接和静态链接简析(库名与库文件名)
- 关于编码问题,报错:'gbk' codec can't encode character '\u3164' in position 0: illegal multibyte sequence...
- 将函数储存在模块中(2)
- php 调用永中云,永中优云:是时候给大家介绍真正的云端Office了
- es like模糊匹配_Elastic search模糊匹配,精确匹配显示在前
- python程序设计与算法基础教程微课版课后答案_Python程序设计与算法基础教程
- 锐捷S12010交换机配置端口镜像
- 计算机键盘上的句号键在哪,电脑键盘句号是哪个键
- 【用于图像修复、数据增强等】结合官方代码教程,在Windows 10下运行pix2pix-tensorflow(tensorflow==1.4.0 python=3.6)
- Linux- rsync企业级实战
- 智能优化算法期末复习