1、关于Java8部分新特性介绍

Java8的新特性很多,在此就不一一介绍了,这里只说一下我自己在工作用用得比较多的几点:

1.1、Lambda表达式

Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

  • 语法格式:

  (parameters) -> expression 或者 (parameters) -> {statements;}

  • PS:

  (1)如果参数只有一个,可以不加圆括号

  (2)不需要声明参数类型

  (3)如果只有一条语句,可以不加花括号

  (4)如果只有一条语句,编译器会自动将值返回;如果多条的话,需要手动return

1.2、方法引用

方法引用通过方法的名字来指向一个方法

  • 语法格式:

  方法引用使用一对冒号 ::

  

  构造方法引用: 类::new

  静态方法引用:类::静态方法

  实例方法引用:类::实例方法  或者  对象::实例方法

1.3、Stream API

这个有点像Strom的处理方法(Spout和Blot),又有点像MapReduce(map和reduce)。用流的方式去处理,把一个集合元素转成一个一个的流,然后分别处理,最后再汇总。

1.4、接口中可以定义默认方法和静态方法

2、Stream API

     private List<CouponInfo> couponInfoList;

     private List<String> strList;

     private List<Integer> intList;

     @Before
public void init() {
CouponInfo couponInfo1 = new CouponInfo(123L, 10001, "5元现金券");
CouponInfo couponInfo2 = new CouponInfo(124L, 10001, "10元现金券");
CouponInfo couponInfo3 = new CouponInfo(125L, 10002, "全场9折");
CouponInfo couponInfo4 = new CouponInfo(126L, 10002, "全场8折");
CouponInfo couponInfo5 = new CouponInfo(127L, 10003, "全场7折"); couponInfoList = new ArrayList<>();
couponInfoList.add(couponInfo1);
couponInfoList.add(couponInfo2);
couponInfoList.add(couponInfo3);
couponInfoList.add(couponInfo4);
couponInfoList.add(couponInfo5); couponInfoList = new ArrayList<>();
couponInfoList.add(couponInfo1);
couponInfoList.add(couponInfo2);
couponInfoList.add(couponInfo3);
couponInfoList.add(couponInfo4);
couponInfoList.add(couponInfo5); strList = Arrays.asList(new String[]{"A", "S", "D", "F", "X", "C", "Y", "H", "", null}); intList = Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6, 6, 2, 3});
}

2.1、forEach

     /**
* 迭代 forEach
*/
@Test
public void testForEach() {
strList.stream().forEach(System.out::println);
strList.stream().forEach(e->System.out.print(e));
System.out.println();
strList.forEach(System.out::print);
}
A
S
D
F
X
C
Y
H null
ASDFXCYHnull
ASDFXCYHnull

2.2、filter

     /**
* 过滤 filter
*/
@Test
public void testFilter() {
List<String> list = strList.stream().filter(x-> StringUtils.isNotBlank(x)).collect(Collectors.toList());
System.out.println(list);
List<Integer> list2 = intList.stream().distinct().collect(Collectors.toList());
System.out.println(list2);
List<CouponInfo> list3 = couponInfoList.stream().filter(x->x.getMerchantId() != 10001).collect(Collectors.toList());
System.out.println(list3);
}
[A, S, D, F, X, C, Y, H]
[1, 2, 3, 4, 5, 6]
[CouponInfo{id=125, merchantId=10002, couponName='全场9折'}, CouponInfo{id=126, merchantId=10002, couponName='全场8折'}, CouponInfo{id=127, merchantId=10003, couponName='全场7折'}]

2.3、limit

     /**
* limit
*/
@Test
public void testLimit() {
List<String> list = strList.stream().limit(3).collect(Collectors.toList());
System.out.println(list);
}
[A, S, D]

2.4、sorted

     /**
* 排序 sorted
*/
@Test
public void testSorted() {
List<Integer> list = intList.stream().sorted().collect(Collectors.toList());
System.out.println(list);
// 倒序
List<Integer> list2 = intList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(list2); List<String> list3 = strList.stream().sorted(Comparator.nullsLast(Comparator.naturalOrder())).collect(Collectors.toList());
List<String> list4 = strList.stream().sorted(Comparator.nullsLast(Comparator.reverseOrder())).collect(Collectors.toList());
System.out.println(list3);
System.out.println(list4); List<CouponInfo> list5 = couponInfoList.stream().sorted(Comparator.comparing(CouponInfo::getId)).collect(Collectors.toList());
List<CouponInfo> list6 = couponInfoList.stream().sorted(Comparator.comparing(CouponInfo::getId).reversed()).collect(Collectors.toList());
List<Long> list51 = list5.stream().map(e->e.getId()).collect(Collectors.toList());
List<Long> list61 = list6.stream().map(e->e.getId()).collect(Collectors.toList());
System.out.println(list51);
System.out.println(list61);
}
[1, 2, 2, 3, 3, 4, 5, 6, 6]
[6, 6, 5, 4, 3, 3, 2, 2, 1]
[, A, C, D, F, H, S, X, Y, null]
[Y, X, S, H, F, D, C, A, , null]
[123, 124, 125, 126, 127]
[127, 126, 125, 124, 123]

2.5、map

     /**
* map
* 对每个元素进行处理,相当于MapReduce中的map阶段
* Collectors.mapping()类似
*/
@Test
public void testMap() {
List<Integer> list = intList.stream().map(e->2*e).collect(Collectors.toList());
System.out.println(list);
}
[2, 4, 6, 8, 10, 12, 12, 4, 6]

2.6、toMap

     /**
* 转成Map<K,V>
*
* 特别注意,key不能重复,如果重复的话默认会报错,可以指定key重复的时候怎么处理
*
* 例如:Map<String, Student> studentIdToStudent = students.stream().collect(toMap(Student::getId, Functions.identity());
*/
@Test
public void testToMap() {
// 因为ID不重复,所以这里这么写没问题;但如果key换成CouponInfo::getMerchantId就有问题了
Map<Long, CouponInfo> map = couponInfoList.stream().collect(Collectors.toMap(CouponInfo::getId, Function.identity()));
// 这里重复的处理方式就是用后者覆盖前者
Map<Integer, CouponInfo> map2 = couponInfoList.stream().collect(Collectors.toMap(CouponInfo::getMerchantId, Function.identity(), (c1, c2)->c2));
Map<Integer, CouponInfo> map3 = couponInfoList.stream().collect(Collectors.toMap(CouponInfo::getMerchantId, Function.identity(),
(c1, c2)->{if (c1.getId() > c2.getId()) {
return c2;
}else {
return c1;
}
}));
System.out.println(map);
System.out.println(map2);
System.out.println(map3);
}
{123=CouponInfo{id=123, merchantId=10001, couponName='5元现金券'}, 124=CouponInfo{id=124, merchantId=10001, couponName='10元现金券'}, 125=CouponInfo{id=125, merchantId=10002, couponName='全场9折'}, 126=CouponInfo{id=126, merchantId=10002, couponName='全场8折'}, 127=CouponInfo{id=127, merchantId=10003, couponName='全场7折'}}
{10001=CouponInfo{id=124, merchantId=10001, couponName='10元现金券'}, 10002=CouponInfo{id=126, merchantId=10002, couponName='全场8折'}, 10003=CouponInfo{id=127, merchantId=10003, couponName='全场7折'}}
{10001=CouponInfo{id=123, merchantId=10001, couponName='5元现金券'}, 10002=CouponInfo{id=125, merchantId=10002, couponName='全场9折'}, 10003=CouponInfo{id=127, merchantId=10003, couponName='全场7折'}}

2.6、groupingBy

     /**
* 分组 groupingBy
*/
@Test
public void testGroupBy() {
Map<Integer, List<CouponInfo>> map = couponInfoList.stream().collect(Collectors.groupingBy(CouponInfo::getMerchantId));
Map<Integer, Long> map2 = couponInfoList.stream().collect(Collectors.groupingBy(CouponInfo::getMerchantId, Collectors.counting()));
Map<Integer, Set<String>> map3 = couponInfoList.stream().collect(Collectors.groupingBy(CouponInfo::getMerchantId, Collectors.mapping(CouponInfo::getCouponName, Collectors.toSet())));
System.out.println(map);
System.out.println(map2);
System.out.println(map3);
}
{10001=[CouponInfo{id=123, merchantId=10001, couponName='5元现金券'}, CouponInfo{id=124, merchantId=10001, couponName='10元现金券'}], 10002=[CouponInfo{id=125, merchantId=10002, couponName='全场9折'}, CouponInfo{id=126, merchantId=10002, couponName='全场8折'}], 10003=[CouponInfo{id=127, merchantId=10003, couponName='全场7折'}]}
{10001=2, 10002=2, 10003=1}
{10001=[10元现金券, 5元现金券], 10002=[全场9折, 全场8折], 10003=[全场7折]}

2.7、summary

     /**
* 数值统计
*/
@Test
public void testSum() {
IntSummaryStatistics summaryStatistics = intList.stream().mapToInt(x->x).summaryStatistics();
System.out.println(summaryStatistics.getMax());
System.out.println(summaryStatistics.getMin());
System.out.println(summaryStatistics.getAverage());
System.out.println(summaryStatistics.getSum());
}
6
1
3.5555555555555554
32

3、完整代码

 package com.cjs.boot.demo;

 import com.cjs.boot.domain.entity.CouponInfo;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Test; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; public class StreamDemoTest { private List<CouponInfo> couponInfoList; private List<String> strList; private List<Integer> intList; @Before
public void init() {
CouponInfo couponInfo1 = new CouponInfo(123L, 10001, "5元现金券");
CouponInfo couponInfo2 = new CouponInfo(124L, 10001, "10元现金券");
CouponInfo couponInfo3 = new CouponInfo(125L, 10002, "全场9折");
CouponInfo couponInfo4 = new CouponInfo(126L, 10002, "全场8折");
CouponInfo couponInfo5 = new CouponInfo(127L, 10003, "全场7折"); couponInfoList = new ArrayList<>();
couponInfoList.add(couponInfo1);
couponInfoList.add(couponInfo2);
couponInfoList.add(couponInfo3);
couponInfoList.add(couponInfo4);
couponInfoList.add(couponInfo5); couponInfoList = new ArrayList<>();
couponInfoList.add(couponInfo1);
couponInfoList.add(couponInfo2);
couponInfoList.add(couponInfo3);
couponInfoList.add(couponInfo4);
couponInfoList.add(couponInfo5); strList = Arrays.asList(new String[]{"A", "S", "D", "F", "X", "C", "Y", "H", "", null}); intList = Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6, 6, 2, 3});
} /**
* 迭代 forEach
*/
@Test
public void testForEach() {
strList.stream().forEach(System.out::println);
strList.stream().forEach(e->System.out.print(e));
System.out.println();
strList.forEach(System.out::print);
} /**
* 过滤 filter
*/
@Test
public void testFilter() {
List<String> list = strList.stream().filter(x-> StringUtils.isNotBlank(x)).collect(Collectors.toList());
System.out.println(list);
List<Integer> list2 = intList.stream().distinct().collect(Collectors.toList());
System.out.println(list2);
List<CouponInfo> list3 = couponInfoList.stream().filter(x->x.getMerchantId() != 10001).collect(Collectors.toList());
System.out.println(list3);
} /**
* limit
*/
@Test
public void testLimit() {
List<String> list = strList.stream().limit(3).collect(Collectors.toList());
System.out.println(list);
} /**
* 排序 sorted
*/
@Test
public void testSorted() {
List<Integer> list = intList.stream().sorted().collect(Collectors.toList());
System.out.println(list);
// 倒序
List<Integer> list2 = intList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(list2); List<String> list3 = strList.stream().sorted(Comparator.nullsLast(Comparator.naturalOrder())).collect(Collectors.toList());
List<String> list4 = strList.stream().sorted(Comparator.nullsLast(Comparator.reverseOrder())).collect(Collectors.toList());
System.out.println(list3);
System.out.println(list4); List<CouponInfo> list5 = couponInfoList.stream().sorted(Comparator.comparing(CouponInfo::getId)).collect(Collectors.toList());
List<CouponInfo> list6 = couponInfoList.stream().sorted(Comparator.comparing(CouponInfo::getId).reversed()).collect(Collectors.toList());
List<Long> list51 = list5.stream().map(e->e.getId()).collect(Collectors.toList());
List<Long> list61 = list6.stream().map(e->e.getId()).collect(Collectors.toList());
System.out.println(list51);
System.out.println(list61);
} /**
* map
* 对每个元素进行处理,相当于MapReduce中的map阶段
* Collectors.mapping()类似
*/
@Test
public void testMap() {
List<Integer> list = intList.stream().map(e->2*e).collect(Collectors.toList());
System.out.println(list);
} /**
* 转成Map<K,V>
*
* 特别注意,key不能重复,如果重复的话默认会报错,可以指定key重复的时候怎么处理
*
* 例如:Map<String, Student> studentIdToStudent = students.stream().collect(toMap(Student::getId, Functions.identity());
*/
@Test
public void testToMap() {
// 因为ID不重复,所以这里这么写没问题;但如果key换成CouponInfo::getMerchantId就有问题了
Map<Long, CouponInfo> map = couponInfoList.stream().collect(Collectors.toMap(CouponInfo::getId, Function.identity()));
// 这里重复的处理方式就是用后者覆盖前者
Map<Integer, CouponInfo> map2 = couponInfoList.stream().collect(Collectors.toMap(CouponInfo::getMerchantId, Function.identity(), (c1, c2)->c2));
Map<Integer, CouponInfo> map3 = couponInfoList.stream().collect(Collectors.toMap(CouponInfo::getMerchantId, Function.identity(),
(c1, c2)->{if (c1.getId() > c2.getId()) {
return c2;
}else {
return c1;
}
}));
System.out.println(map);
System.out.println(map2);
System.out.println(map3);
} /**
* 分组 groupingBy
*/
@Test
public void testGroupBy() {
Map<Integer, List<CouponInfo>> map = couponInfoList.stream().collect(Collectors.groupingBy(CouponInfo::getMerchantId));
Map<Integer, Long> map2 = couponInfoList.stream().collect(Collectors.groupingBy(CouponInfo::getMerchantId, Collectors.counting()));
Map<Integer, Set<String>> map3 = couponInfoList.stream().collect(Collectors.groupingBy(CouponInfo::getMerchantId, Collectors.mapping(CouponInfo::getCouponName, Collectors.toSet())));
System.out.println(map);
System.out.println(map2);
System.out.println(map3);
} /**
* 数值统计
*/
@Test
public void testSum() {
IntSummaryStatistics summaryStatistics = intList.stream().mapToInt(x->x).summaryStatistics();
System.out.println(summaryStatistics.getMax());
System.out.println(summaryStatistics.getMin());
System.out.println(summaryStatistics.getAverage());
System.out.println(summaryStatistics.getSum());
} }

参考

http://ifeve.com/java-8-tutorial-2/

https://www.cnblogs.com/justcooooode/p/7701260.html

Java 8 Stream的更多相关文章

  1. Java 8 Stream API详解--转

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

  2. java之stream(jdk8)

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

  3. Java 8 Stream API Example Tutorial

    Stream API Overview Before we look into Java 8 Stream API Examples, let’s see why it was required. S ...

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

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

  5. [零]java8 函数式编程入门官方文档中文版 java.util.stream 中文版 流处理的相关概念

    前言 本文为java.util.stream 包文档的译文 极其个别部分可能为了更好理解,陈述略有改动,与原文几乎一致 原文可参考在线API文档 https://docs.oracle.com/jav ...

  6. java 11 Stream 加强

    Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法. 1) 增加单个参数构造方法,可为null Stream.ofNullable(null).c ...

  7. Java 8 新特性-菜鸟教程 (5) -Java 8 Stream

    Java 8 Stream Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种 ...

  8. 关于java中Stream理解

    关于java中Stream理解 Stream是什么 Stream:Java 8新增的接口,Stream可以认为是一个高级版本的Iterator.它代表着数据流,流中的数据元素的数量可以是有限的, 也可 ...

  9. java.util.stream 库简介

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

随机推荐

  1. 解决Xshell显示中文乱码的问题

    执行echo $LANG命令输出的是当前的编码方式,执行locale命令得到系统中所有可用的编码方式.要让Xshell不显示乱码,则要将编码方式改为UTF-8. 在Xshell中[file]-> ...

  2. vbox centos安装增强工具

    就是虚拟机识别不了宿主机的usb接口,这个虚拟机有没有图形界面,看看怎么装. 一个是依赖包问题,另一个就是挂了安装包,但是我怎么找到它并安装上去的问题. 虚拟机是centos6.6哈 vbox4.3. ...

  3. 【Android 应用开发】 ActionBar 基础

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3920439 ...

  4. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  5. Github Coding Developer Book For LiuGuiLinAndroid

    Github Coding Developer Book For LiuGuiLinAndroid 收集了这么多开源的PDF,也许会帮到一些人,现在里面的书籍还不是很多,我也在一点点的上传,才上传不到 ...

  6. android开发之http协议

    http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  7. UE4 Hello World 创建第一个UE4工程

    首先先熟悉几个UE4常用的类 AGameMode(控制整个项目的逻辑) The GameMode defines the game being played. It governs thegame r ...

  8. 【翻译】在Ext JS应用程序中使用自定义图标

    原文:Using Custom Icons in Your Ext JS App 作者:Lee BoonstraLee is a technical trainer at Sencha. She's ...

  9. Customer Form Issue: Automatic Matching Rule Set Defaults Value AutoRuleSet-1

    In this Document   Symptoms   Changes   Cause   Solution   References APPLIES TO: Oracle Receivables ...

  10. 【一天一道leetcode】 #2 Add Two Numbers

    一天一道leetcode系列 (一)题目: You are given two linked lists representing two non-negative numbers. The digi ...