/**
* @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的使用的更多相关文章

  1. 如何用Java8 Stream API找到心仪的女朋友

    传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...

  2. 何用Java8 Stream API进行数据抽取与收集

    上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...

  3. 使用Java8 Stream API对Map按键或值进行排序

    一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams ...

  4. Fork/Join框架与Java8 Stream API 之并行流的速度比较

    Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...

  5. Java8 Stream API

    Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String co ...

  6. java8 stream api流式编程

    java8自带常用的函数式接口 Predicate boolean test(T t) 传入一个参数返回boolean值 Consumer void accept(T t) 传入一个参数,无返回值 F ...

  7. java8 Stream API笔记

    生成Stream Source的方式 从Collection和数组生成 * Collection.stream() * Collection.parallelStream() * Arrays.str ...

  8. 1.分类维护-通过Java8 Stream API 获取商品三级分类数据

    实体类 @Data @TableName("pms_category") public class CategoryEntity implements Serializable { ...

  9. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

随机推荐

  1. mongo 聚合函数

    一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...

  2. WIN7与WIN10 安装

    ---恢复内容开始--- 开始的操作系统是黑白屏的DOS,随着光标的一闪一闪并逐渐后移,一条条指令输入电脑,并执行相关指令完成任务.慢慢的,视窗操作系统最初是基于DOS的windows 9X内核WIN ...

  3. SAP Cloud for Customer Account和individual customer的区别

    在SAP Cloud for Customer的Customers工作中心里,有三个视图:Accounts,Contacts和Individual Customers. 这三种主数据的区别是什么?我们 ...

  4. C#图解教程读书笔记(第4章 类:基础)

    类成员包括数据成员和函数成员. 和C/C++不同,C#在类型的外部不能声明全局变量,所有的字段都属于类型,而且必须在类型声明内部声明. 和C/C++不同,方法没有返回默认类型,所有方法必须包含返回类型 ...

  5. 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=\ ...

  6. textarea使换行变顿号

    window.onload = function(){ document.getElementById('area').addEventListener('keydown',function(e){ ...

  7. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  8. 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 ...

  9. http1.X与2.0

    HTTP HTTP 1.X HTTP是建立在TCP协议上的,HTTP协议的瓶颈及优化都是基于TCP协议本身的特性. TCP建立连接时有三次握手 会有1.5RTT的延迟,为了避免每次请求都经历握手待来的 ...

  10. iOS universallinks唤醒app

    从iOS9之后,苹果就推出了这个功能,用来唤醒外部app.这个功能在那些电商app上使用尤其广泛,当你打开对应的h5网页后,上面跳出一个是否跳转app的按钮. 现在iOS11已经基本覆盖,iOS12也 ...