(原)

stream中另一些比较常用的方法.

1、

public static<T> Stream<T> generate(Supplier<T> s) 

通过generate返回一个Stream对象,接收一个 Supplier函数

例如:

Stream stream8 = Stream.generate(UUID.randomUUID()::toString);

2、

Optional<T> findFirst(); 

This is a short-circuiting terminal operation

这是一个终止操作,返回一个Optional,为什么是Optional而不是一个对象T呢?因为Stream中可能会有空的情况,就像这样Stream stream8 = Stream.empty();

如果是这样,那么findFirst()可能会返回null值,所以才用了Optional来规避空值的情况。

例如:

Stream stream8 = Stream.generate(UUID.randomUUID()::toString);
stream8.findFirst().ifPresent(System.out::println);

3、

public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)

Returns an infinite sequential ordered {@code Stream} produced by iterative
application of a function {@code f} to an initial element {@code seed}

producing a {@code Stream} consisting of {@code seed}, {@code f(seed)},
*{@code f(f(seed))}, etc.

用这个种子元素seed,通过迭代f,返回一个无限的串行的有序的流元素,

最后的stream的结果是一个seed ,f(seed),f(f(seed)) … 的结果。

由于这个方法是无限循环的,所以往往会跟limit终止操作配合使用。

它的第2个参数UnaryOperator是这样定义的:

public interface UnaryOperator<T> extends Function<T, T>

如果它的apply方法接收参数和返回参数是同一类型,是一个一元的Function函数

例如:

Stream.iterate(1,i -> i + 2).limit(3).forEach(System.out::println);

返回的结果将是1、3、5。

4、

Stream<T> limit(long maxSize);

Returns a stream consisting of the elements of this stream, truncated
to be no longer than {@code maxSize} in length

返回一个长度不超过给定参数maxSize大小的stream

Stream<T> skip(long n);

Returns a stream consisting of the remaining elements of this stream
after discarding the first {@code n} elements of the stream

返回一个丢弃了前n个元素之后的stream。

例如:iterate生成一个从1开始往后加1的stream,先限定这个stream长度为5,再忽略前2个,取后3个元素输出。


Stream.iterate(1, i -> i + 1).limit(5).skip(2).forEach(System.out::println);

5、

Stream<T> distinct()

没啥说的,去重用的。

例如:

IntStream.of(1,1,3,4,5,6,4).distinct().forEach(System.out::println);

返回1,3,4,5,6

6 、

Optional<T> max(Comparator<? super T> comparator)
Optional<T> min(Comparator<? super T> comparator)

求最大最小值,一般而言,如果是数字可用IntStream,IntStream中的求最大值,最小值是不带参数的,max(),min(),另外还提供了一个sum()求和方法。

如果IntStream是一个空对象,那么sum可以返回0,而min,max是一个null , 所以这里sum的返回值用的是int,而min和max返回值是OptionalInt,用于规避值为null的情况,所以一般可以这么写.


IntStream.of(1,2,3,4,5).max().ifPresent(System.out::println);

针对于IntStream的统计方法,它还额外提供了一个方法:

IntSummaryStatistics summaryStatistics()

IntSummaryStatistics 这个类,它也提供了数值统计的常用方法,如count,sum,min,max ,average等

例如:

IntSummaryStatistics intSummaryStatistics = IntStream.of(1, 2, 3, 4, 5).summaryStatistics();
System.out.println(intSummaryStatistics.getMax());
System.out.println(intSummaryStatistics.getMin());
System.out.println(intSummaryStatistics.getAverage());

使用场景:

1、将stream元素去重

Stream<String> stream1 = Stream.of("happy new", "new year", "happy year","new happy");

stream1.map(item -> item.split(" ")).flatMap(Arrays::stream).distinct().collect(Collectors.toList()).forEach(System.out::println);

2、如何将二个集合中的元素做笛卡尔集,交叉拼接

List<String> list1 = Arrays.asList("hello","world","today");
List<String> list2 = Arrays.asList("a","b","c"); list1.stream().flatMap(item -> list2.stream().map(item2 -> item + " " + item2)).collect(Collectors.toList()).forEach(System.out::println);

3、如果有一个对象Student,包含二个属性,name和age,在一个student集合中如何分组。

class Student{
private String name;
private Integer age; public Student(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Student s1 = new Student("zhangsan", 30);
Student s2 = new Student("lisi", 26);
Student s3 = new Student("wangwu",30);
Student s4 = new Student("lisi",22);

//根据姓名分组

List<Student> list3 = Arrays.asList(s1, s2, s3, s4);
Map<String,List<Student>> map3 = list3.stream().collect(Collectors.groupingBy(Student::getName));
map3.forEach((key,value) -> System.out.println(key+":"+value));

//查看根据姓名分组后每组多少数量

List<Student> list4 = Arrays.asList(s1, s2, s3, s4);
Map<String,Long> map4 = list4.stream().collect(Collectors.groupingBy(Student::getName,Collectors.counting()));
map4.forEach((key,value) -> System.out.println(key+":"+value));

//查看根据姓名分组后,每个组平均年龄

List<Student> list5 = Arrays.asList(s1, s2, s3, s4);
Map<String,Double> map5 = list5.stream().collect(Collectors.groupingBy(Student::getName,Collectors.averagingDouble(Student::getAge)));
map5.forEach((key,value) -> System.out.println(key+":"+value));

//查看根据年龄分区,25岁以上为一个区,分区类似于分组,但是只有二个组,一个true,一个false,

List<Student> list6 = Arrays.asList(s1, s2, s3, s4);
Map<Boolean,List<Student>> map6 = list6.stream().collect(Collectors.partitioningBy(s -> s.getAge() > 25));
map6.forEach((key,value) -> System.out.println(key+":"+value));
例子请看这里:https://github.com/LeeScofield/java8

Java 8 Stream介绍及使用2的更多相关文章

  1. Java 8 Stream介绍及使用1

    (原) stream的内容比较多,先简单看一下它的说明: A sequence of elements supporting sequential and parallel aggregate * o ...

  2. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  3. java之stream(jdk8)

    一.stream介绍 参考: Java 8 中的 Streams API 详解   Package java.util.stream   Java8初体验(二)Stream语法详解   二.例子 im ...

  4. Java笔记:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  5. Java 8 Stream

    1.关于Java8部分新特性介绍 Java8的新特性很多,在此就不一一介绍了,这里只说一下我自己在工作用用得比较多的几点: 1.1.Lambda表达式 Lambda允许把函数作为一个方法的参数(函数作 ...

  6. java.util.stream 库简介

    Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...

  7. Java - 17 Java 流(Stream)、文件(File)和IO

    Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型. ...

  8. Java之Stream流

    Stream流的初步学习 初次学习Stream流的学习笔记,学习之前先了解一下函数式接口 概述 API是一个程序向使用者提供的一些方法,通过这些方法就能实现某些功能.所以对于流API来 说,重点是怎么 ...

  9. Java总结:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

随机推荐

  1. SQLServer之修改用户自定义数据库用户

    修改用户自定义数据库用户注意事项 默认架构将是服务器为此数据库用户解析对象名时将搜索的第一个架构. 除非另外指定,否则默认架构将是此数据库用户创建的对象所属的架构. 如果用户具有默认架构,则将使用默认 ...

  2. MVC添加Area出现“到多个与名为“Home”的控制器匹配的类型的解决方法”

    新建MVC项目,添加HomeController,然后添加名字为Admin的Area后,新建HomeController.这个时候,运行项目会出现以下错误: 解决办法如下: 打开网址下面的HomeCo ...

  3. 关于.Net mvc 项目在本地vs运行响应时间过长无法访问时,解决方法!

    最近可能是刚升级了电脑使用了window10操作系统,总是遇到了一些以前没有遇到过的事情! 今早来到公司本来准备写bug的,但是当我打开vs运行的时候发现今天的电脑响应的时间明显的要比之前打开网页调试 ...

  4. mpvue小程序开发之 wx.getUserInfo获取用户信息授权

    一.背景 在使用美团的mpvue2.0框架搭建起小程序项目后,做获取用户信息时遇到一些问题:微信小程序更新api后,获取用户信息只能通过button上的绑定方法 来获取用户信息,vue上方法绑定不能直 ...

  5. ASP.NET Core MVC应用程序中的后台工作任务

    在应用程序的内存中缓存常见数据(如查找)可以显着提高您的MVC Web应用程序性能和响应时间.当然,这些数据必须定期刷新. 当然你可以使用任何方法来更新数据,例如Redis中就提供了设定缓存对象的生命 ...

  6. 从大数据技术变迁猜一猜AI人工智能的发展

    目前大数据已经成为了各家互联网公司的核心资产和竞争力了,其实不仅是互联网公司,包括传统企业也拥有大量的数据,也想把这些数据发挥出作用.在这种环境下,大数据技术的重要性和火爆程度相信没有人去怀疑. 而A ...

  7. vue的混合mixins学习

    mixins   混合 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.   混合对象可以包含任意组件选项.   当组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选 ...

  8. 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用

    知识点 旅行商问题的线性规划模型旅行商问题的+Leapms模型及CPLEX求解C++调用+Leapms 旅行商问题 旅行商问题是一个重要的NP-难问题.一个旅行商人目前在城市1,他必须对其余n-1个城 ...

  9. C#代码安装Windows服务(控制台应用集成Windows服务)

    最近在为一款C/S架构的科研软件开发云计算版,需要用到WCF,考虑到不需要什么界面以及稳定性,无人值守性,准备用Windows Service作为宿主,无奈Windows Service的安装太为繁复 ...

  10. 【面试】吃透了这些Redis知识点,面试官一定觉得你很NB(干货 | 建议珍藏)

    万字长文,干货满满. 是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义.redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有 ...