JAVA8 Stream API的使用
/**
* @auther hhh
* @date 2018/12/31 12:48
* @description Stream流:用来处理数组、集合的API
* 1、不是数据结构,没有内部存储(只是用来操作与处理)
* 2、不支持索引访问
* 3、延迟计算
* 4、支持并行
* 5、很容易生成数组或者集合
* 5、支持过滤、查找、转换、汇总、聚合等操作
*
* Stream分为 源source、中间操作、终止操作
* 流的源可以是数组、集合、生成器方法,一个I/O通道等等
* 一个流可以有零个或者多个中间操作,每一个中间操作都会放回一个新的流,供下个操作使用,一个流只会有一个终止操作
* Stream只有遇到终止操作,他的源才会执行遍历操作
*/
public class StreamTest {
public static void main(String[] args) {
/**
* 中间操作API:
* 过滤:filter
* 去重:distinct
* 排序:sorted
* 截取:limit、skip
* 转换:map/flatMap
* 其他:peek
*/
/**
* 终止操作:
* 循环:forEach
* 计算:min/max/count/average
* 匹配:anyMatch/allMatch/noneMatch/findFirst/findAny
* 汇聚:reduce
* 收集器:toArray/collect
*/
}
}
创建Stream:
/**
* @auther hhh
* @date 2018/12/31 13:08
* @description Stream流的创建
*/
public class CreatedStreamTest {
/**
* 创建Stream:
* 通过数组
* 通过集合
* 通过Stream.generate创建
* 通过Stream.iterate方法创建
* 其他API创建
*/
//通过数组(一般都是使用集合和流进行创建是最多的)
static void stringGen() {
String[] arr = {"a", "b", "c", "12"};
Stream<String> stringStream = Stream.of(arr);
}
//通过集合
static void listGen() {
List<String> lists = Arrays.asList("a", "b", "c", "12");
Stream<String> stringStream = lists.stream();
}
//通过Stream.generate创建(使用 Supplier提供一个输出)
//iterate与generate是无止境流,会一直调用函数式接口进行输出,可以进行截取
static void generateGen() {
Stream<Integer> stream = Stream.generate(() -> 1);
}
//通过Stream.iterate方法创建(通过UnaryOperator<T>提供输入输出,三个类型必须为一致)
static void iterateGen() {
Stream.iterate(1,(x) -> x+1).limit(10).forEach(x -> System.out.println(x));
Stream.iterate("1",(x) -> x.toString()).limit(10).forEach(x -> System.out.println(x));;
}
//其他API创建
static void otherGen() throws Exception{
String s = "abcdefg";
IntStream intStream = s.chars();//返回一个int类型的Stream
//终止操作
intStream.forEach(x -> System.out.println(x));
// intStream.forEach(System.out::println);
Files.lines(Paths.get("D:\\MyCode\\vaildating\\src\\main\\java\\com\\example\\vaildating\\VaildatingApplication.java")).forEach(x -> System.out.println(x));
}
public static void main(String[] args) throws Exception{
iterateGen();
otherGen();
}
}
/**
* @auther hhh
* @date 2018/12/31 13:44
* @description 中间操作API
*/
public class MiddleOperaStream {
/**
* 中间操作API:
* 过滤:filter
* 去重:distinct
* 排序:sorted
* 截取:limit、skip
* 转换:map/flatMap
* 其他:peek
*/
public static void main(String[] args) throws Exception {
List<Integer> list = Arrays.asList(2, 6, 1, 3, 7, 4, 8, 9);
//创建流
list.stream().filter(x -> x % 2 == 0).forEach(System.out::println);
//中间操作与终止操作,终止操作只能有一个
int sum = list.stream().filter(x -> x % 2 == 0).mapToInt(x -> x).sum();
System.out.println(sum);
//在进行最大值与最小值输出的时候,需要传入一个比较器
int max = list.stream().max((a, b) -> a - b).get();
int min = list.stream().min((a, b) -> a - b).get();
System.out.println(max + " " + min);
//匹配终止操作
//输出所有集合中的偶素,默认从小大大排序
Optional<Integer> any = list.stream().filter(x -> x % 2 == 0).sorted().findFirst();
//从大到小排序,传入一个比较器
Optional<Integer> sorted = list.stream().filter(x -> x % 2 == 0).sorted((a,b)->b-a).findFirst();
//传入升序比较器 Comparator.naturalOrder()
Optional<Integer> sorted1 = list.stream().filter(x -> x % 2 == 0).sorted(Comparator.naturalOrder()).findFirst();
//传入降序比较器 Comparator.reverseOrder()
Optional<Integer> sorted2 = list.stream().filter(x -> x % 2 == 0).sorted(Comparator.reverseOrder()).findFirst();
System.out.println(any.get() + "====" + sorted.get()+"==="+sorted1.get()+"==="+sorted2.get());//2====8===2===8
Optional<Integer> first = list.stream().filter(x -> x % 2 == 0).findFirst();
List<Integer> l= list.stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
List<Integer> ll = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(l+"==="+ll);//[1, 2, 3, 4, 6, 7, 8, 9]===[9, 8, 7, 6, 4, 3, 2, 1]
//字符串根据长度进行排序
List<String> stringList = Arrays.asList("abc","bc","a","cdef");
List<String> stringList1 = stringList.stream().sorted().collect(Collectors.toList());
List<String> stringList2 = stringList.stream().sorted((a,b)-> b.length()-a.length()).collect(Collectors.toList());
System.out.println(stringList1+"==="+stringList2);//[a, abc, bc, cdef]===[cdef, abc, bc, a]
//去重
List<Integer> integerList = Arrays.asList(1,2,3,4,5,1,2,3);
Set<Integer> integers = integerList.stream().collect(Collectors.toSet());//[1, 2, 3, 4, 5]
System.out.println(integers);
//limit 与 skip 配合分页
List<Integer> list1 = Stream.iterate(1,x -> x+1).limit(50).sorted((a,b) -> b-a).skip(0).limit(10).collect(Collectors.toList());
System.out.println(list1);//[50, 49, 48, 47, 46, 45, 44, 43, 42, 41]
List<Integer> list3 = Stream.iterate(1,x -> x+1).limit(50).sorted((a,b) -> b-a).skip(10).limit(10).collect(Collectors.toList());
System.out.println(list3);//[40, 39, 38, 37, 36, 35, 34, 33, 32, 31] 通过skip个数实现分页 //转换
String s = "11,22,33,44,55";//先通过逗号分割转换成int数组,再相加
String[] split = s.split(",");
Integer sum1 = Stream.of(split).map(x -> Integer.valueOf(x)).mapToInt(x->x).sum();//转换成int数组
System.out.println(sum1);//
Integer sumStream = Stream.of(s.split(",")).mapToInt(x->Integer.valueOf(x)).sum();//转换成int数组
System.out.println(sumStream);//165
//改写成方法的引用
Integer sum2 = Stream.of(s.split(",")).mapToInt(Integer::valueOf).sum();
System.out.println(sum2);//165 //将字符串转成User对象
String userString = "admin,nginx,apache,jetty";
//User{name='admin'}
//User{name='nginx'}
//User{name='apache'}
//User{name='jetty'}
Stream.of(userString.split(",")).map(x -> new User(x)).forEach(System.out::println);//有构造方法
Stream.of(userString.split(",")).map(x->Person.build(x)).forEach(System.out::println);
Stream.of(userString.split(",")).map(Person::build).forEach(System.out::println);//静态方法引用
//peek :中间操作时,在内部遍历的时候会调用consume去消费(在内部转换的时候去调用内部方法)
//求和例子
//会依从输出
//11
//22
//33
//44
//
Integer sum4 = Stream.of("11,22,33,44,55".split(",")).peek(System.out::println).mapToInt(Integer::valueOf).sum();
}
} class User{
private String name;
public User(String name){
this.name = name;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
class Person{
private String name;
public static Person build(String name){
Person p = new Person();
p.setName(name);
return p;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
JAVA8 Stream API的使用的更多相关文章
- 如何用Java8 Stream API找到心仪的女朋友
传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...
- 何用Java8 Stream API进行数据抽取与收集
上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...
- 使用Java8 Stream API对Map按键或值进行排序
一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams ...
- Fork/Join框架与Java8 Stream API 之并行流的速度比较
Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...
- Java8 Stream API
Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String co ...
- java8 stream api流式编程
java8自带常用的函数式接口 Predicate boolean test(T t) 传入一个参数返回boolean值 Consumer void accept(T t) 传入一个参数,无返回值 F ...
- java8 Stream API笔记
生成Stream Source的方式 从Collection和数组生成 * Collection.stream() * Collection.parallelStream() * Arrays.str ...
- 1.分类维护-通过Java8 Stream API 获取商品三级分类数据
实体类 @Data @TableName("pms_category") public class CategoryEntity implements Serializable { ...
- 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?
写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...
随机推荐
- mongo 聚合函数
一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...
- WIN7与WIN10 安装
---恢复内容开始--- 开始的操作系统是黑白屏的DOS,随着光标的一闪一闪并逐渐后移,一条条指令输入电脑,并执行相关指令完成任务.慢慢的,视窗操作系统最初是基于DOS的windows 9X内核WIN ...
- SAP Cloud for Customer Account和individual customer的区别
在SAP Cloud for Customer的Customers工作中心里,有三个视图:Accounts,Contacts和Individual Customers. 这三种主数据的区别是什么?我们 ...
- C#图解教程读书笔记(第4章 类:基础)
类成员包括数据成员和函数成员. 和C/C++不同,C#在类型的外部不能声明全局变量,所有的字段都属于类型,而且必须在类型声明内部声明. 和C/C++不同,方法没有返回默认类型,所有方法必须包含返回类型 ...
- UOJ #62. 【UR #5】怎样跑得更快
题目分析 显然不可能高斯消元. 考虑反演. \(b_i=\sum\limits_{j=1}^n\gcd(i,j)^C\cdot \text{lcm}(i,j)^D\cdot x_j\) \(b_i=\ ...
- textarea使换行变顿号
window.onload = function(){ document.getElementById('area').addEventListener('keydown',function(e){ ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- Gradle Goodness: Running Java Applications from External Dependency
With Gradle we can execute Java applications using the JavaExec task or the javaexec() method. If we ...
- http1.X与2.0
HTTP HTTP 1.X HTTP是建立在TCP协议上的,HTTP协议的瓶颈及优化都是基于TCP协议本身的特性. TCP建立连接时有三次握手 会有1.5RTT的延迟,为了避免每次请求都经历握手待来的 ...
- iOS universallinks唤醒app
从iOS9之后,苹果就推出了这个功能,用来唤醒外部app.这个功能在那些电商app上使用尤其广泛,当你打开对应的h5网页后,上面跳出一个是否跳转app的按钮. 现在iOS11已经基本覆盖,iOS12也 ...