Java 8 新特性:Lambda、Stream和日期处理
1. Lambda
- 简介
Lambda表达式(Lambda Expression)是匿名函数,Lambda表达式基于数学中的λ演算得名,对应于其中的Lambda抽象(Lambda Abstraction),它是一个匿名函数,即没有函数名的函数。 - 示例
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
/**
* 测试Java8 Lambda
*
* @author CL
*
*/
public class TestLambda {
/**
* 遍历
*/
@Test
@SuppressWarnings("serial")
public void print() {
// 1. 遍历List
List<Integer> list = new ArrayList<Integer>() {
{
add(1);
add(2);
add(3);
}
};
list.forEach(n -> {
System.out.println(n);
});
System.out.println("------------");
list.forEach(System.out::println);
System.out.println("------------");
// 2. 遍历Set
Set<Integer> set = new HashSet<Integer>() {
{
add(1);
add(2);
add(3);
}
};
set.forEach(n -> {
System.out.println(n);
});
System.out.println("------------");
set.forEach(System.out::println);
System.out.println("------------");
// 3. 遍历Map
Map<String, Object> map = new HashMap<String, Object>() {
{
put("id", 1);
put("name", "张三");
put("age", 18);
}
};
map.forEach((k, v) -> {
System.out.println(k + " -> " + v);
});
}
/**
* 创建线程
*/
@Test
public void create() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("r1");
}
};
r1.run();
System.out.println("------------");
Runnable r2 = () -> {
System.out.println("r2");
};
r2.run();
}
}
2. Stream
- 简介
Stream使用一种类似于SQL语句方式来提供对Java集合运算和表达的抽象。Stream API可以使代码更加高效、干净、简洁。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,如筛选、 排序、聚合等。 - 示例
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Stack;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Test;
/**
* 测试Java8 Stream
*
* @author CL
*
*/
public class TestStream {
/**
* 过滤
*/
@Test
@SuppressWarnings("serial")
public void filter() {
List<Integer> list = new ArrayList<Integer>() {
{
add(1);
add(2);
add(2);
add(3);
add(4);
}
};
// 过滤3
list = list.stream().filter(n -> (n != 3)).collect(Collectors.toList());
list.forEach(System.out::println);
}
/**
* 构造流
*/
@Test
@SuppressWarnings({ "rawtypes", "unused" })
public void build() {
// 第一种
Stream s1 = Stream.of("a", "b", "c");
// 第二种
String[] strArray = new String[] { "a", "b", "c" };
Stream s2 = Stream.of(strArray);
// 第三种
Stream s3 = Arrays.stream(strArray);
// 第四种
List<String> strList = Arrays.asList(strArray);
Stream s4 = strList.stream();
}
/**
* 转换
*/
@Test
@SuppressWarnings({ "rawtypes", "unused" })
public void transfer() {
Stream<String> stream = Stream.of("a", "b", "c");
// 转换成String数组
String[] array = stream.toArray(String[]::new);
// 转换成String
String str = stream.collect(Collectors.joining(",")).toString();
// 转换成List
List<String> list1 = stream.collect(Collectors.toList());
List<String> list2 = stream.collect(Collectors.toCollection(ArrayList::new));
// 转换成Set
Set<String> set = stream.collect(Collectors.toSet());
// 转换成堆
Stack stack = stream.collect(Collectors.toCollection(Stack::new));
}
/**
* Stream.map方法,映射元素结果(一对一)
*/
@Test
@SuppressWarnings("serial")
public void map() {
// 转换大写
List<String> list = Arrays.asList("a", "b", "c");
list = list.stream().map(String::toUpperCase).collect(Collectors.toList());
list.forEach(System.out::println);
System.out.println("------------");
// 转换数据类型
List<String> list2 = Arrays.asList("1", "2", "3");
List<Integer> list3 = list2.stream().map(Integer::valueOf).collect(Collectors.toList());
list3.forEach(System.out::println);
System.out.println("------------");
// 计算结果
List<Integer> list4 = Arrays.asList(1, 2, 3);
list4 = list4.stream().map(n -> (n * 2)).collect(Collectors.toList());
list4.forEach(System.out::println);
System.out.println("------------");
// 计算除去3之后的和及个数
List<Integer> list5 = Arrays.asList(1, 2, 3, 4, 5);
int sum = list5.stream().filter(n -> (n != 3)).mapToInt(n -> n).sum();
long count = list5.stream().filter(n -> (n != 3)).mapToInt(n -> n).count();
System.out.println(sum);
System.out.println(count);
System.out.println("------------");
// 统计员工的工资和
List<User> userList = new ArrayList<User>() {
{
add(new User(1, "张三", 1203.12));
add(new User(2, "李四", 2856.43));
add(new User(3, "王五", 947.63));
}
};
double sum2 = userList.stream().mapToDouble(u -> u.getSalary()).sum();
System.out.println(sum2);
System.out.println("------------");
// 统计工资大于1000的人数
long count2 = userList.stream().filter(u -> (u.getSalary() > 1000)).mapToInt(u -> u.getId()).count();
System.out.println(count2);
}
/**
* Stream.flatMap方法,映射元素结果(一对多)
*/
@Test
@SuppressWarnings("serial")
public void flatMap() {
List<String> list = new ArrayList<String>() {
{
add("Knowledge is power");
}
};
// 分割单词
list = list.stream().flatMap(str -> Stream.of(str.split(" "))).filter(s -> s.length() > 0)
.collect(Collectors.toList());
list.forEach(System.out::println);
}
/**
* 限制
*/
@Test
public void limit() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// 取前3条数据
List<Integer> list1 = list.stream().limit(3).collect(Collectors.toList());
list1.forEach(System.out::println);
System.out.println("------------");
// 从第2条数据开始取3条数据
List<Integer> list2 = list.stream().skip(2).limit(3).collect(Collectors.toList());
list2.forEach(System.out::println);
}
/**
* 排序
*/
@Test
@SuppressWarnings("serial")
public void sort() {
List<Integer> list = Arrays.asList(4, 2, 6, 1, 7, 3, 8, 5);
// 默认升序
List<Integer> list1 = list.stream().sorted().collect(Collectors.toList());
list1.forEach(System.out::println);
System.out.println("------------");
// 按照员工工资降序排序
List<User> userList = new ArrayList<User>() {
{
add(new User(1, "张三", 1203.12));
add(new User(2, "李四", 2856.43));
add(new User(3, "王五", 947.63));
}
};
List<User> list2 = userList.stream().sorted((u1, u2) -> (u2.getSalary().compareTo(u1.getSalary())))
.collect(Collectors.toList());
list2.forEach(System.out::println);
}
/**
* Stream.peek方法,返回新的Stream
*/
@Test
public void peek() {
List<Integer> list = Arrays.asList(1, 2, 2, 3, 4);
// 过滤掉不等于2和大于3的数后计算和
int sum = list.stream().filter(n -> (n != 2)).peek(n -> {
// 中间处理
}).filter(n -> (n > 3)).peek(n -> {
// 中间处理
}).mapToInt(n -> n).sum();
System.out.println(sum);
}
/**
* 并行流
*/
@Test
public void parallelStream() {
List<Integer> list = Arrays.asList(1, 2, 2, 3, 4);
// 统计2的个数
long count = list.parallelStream().filter(n -> (n == 2)).count();
System.out.println(count);
}
/**
* 最大、最小、去重
*/
@Test
public void maxAndMinAndDistinct() {
List<Integer> list = Arrays.asList(1, 2, 2, 3, 4);
// 最大值
Integer max = list.stream().max((a, b) -> a.compareTo(b)).get();
System.out.println(max);
System.out.println("------------");
// 最小值
Integer min = list.stream().min((a, b) -> a.compareTo(b)).get();
System.out.println(min);
System.out.println("------------");
// 去重
list = list.stream().distinct().collect(Collectors.toList());
list.forEach(System.out::println);
}
/**
* 匹配<br/>
* allMatch:全部元素符合则返回 true <br/>
* anyMatch:只要有一个元素符合则返回 true <br/>
* noneMatch:没有一个元素符合则返回 true <br/>
*/
@Test
@SuppressWarnings("serial")
public void match() {
List<User> userList = new ArrayList<User>() {
{
add(new User(1, "张三", 1203.12));
add(new User(2, "李四", 2856.43));
add(new User(3, "王五", 947.63));
}
};
// 判断所有人的工资都大于2000
boolean allMatch = userList.stream().allMatch(u -> (u.getSalary() > 2000));
System.out.println(allMatch);
System.out.println("------------");
boolean anyMatch = userList.stream().anyMatch(u -> (u.getSalary() > 2000));
System.out.println(anyMatch);
System.out.println("------------");
boolean noneMatch = userList.stream().noneMatch(u -> (u.getSalary() > 2000));
System.out.println(noneMatch);
}
/**
* reduce和Stream组合使用
*/
@Test
public void reduce() {
// 拼接
List<String> list = Arrays.asList("Knowledge", " ", "is", " ", "power");
String str = list.stream().reduce("", String::concat);
System.out.println(str);
System.out.println("------------");
// 求和
List<Integer> list2 = Arrays.asList(1, 2, 3, 4);
Integer sum = list2.stream().reduce(Integer::sum).get();
System.out.println(sum);
}
/**
* Stream.iterate方法
*/
@Test
public void iterate() {
// 生成等差2的数列
Stream.iterate(2, n -> n + 2).limit(5).forEach(System.out::println);
}
/**
* 分组排序和分区排序 <br/>
* groupingBy:分组排序 <br/>
* partitioningBy:分区排序 <br/>
*/
@Test
@SuppressWarnings("serial")
public void groupyAndPartition() {
List<User> userList = new ArrayList<User>() {
{
add(new User(1, "张三", 1203.12));
add(new User(2, "李四", 2856.43));
add(new User(3, "王五", 947.63));
add(new User(3, "张六", 2417.05));
}
};
// 分组排序
Map<String, List<User>> resultMap = userList.stream().collect(Collectors.groupingBy(User::getName));
for (Map.Entry<String, List<User>> entry : resultMap.entrySet()) {
entry.getValue().forEach(v -> System.out.println(entry.getKey() + " -> " + v));
}
System.out.println("------------");
// 分区排序
Map<Boolean, List<User>> resultMap2 = userList.stream()
.collect(Collectors.partitioningBy(u -> (u.getSalary() > 2000)));
// 大于2000
System.out.println(resultMap2.get(true));
System.out.println("------------");
// 不大于2000
System.out.println(resultMap2.get(false));
}
/**
* 收集统计
*/
@Test
public void summaryStatistics() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
IntSummaryStatistics summaryStatistics = list.stream().mapToInt(n -> n).summaryStatistics();
// 最大值
System.out.println(summaryStatistics.getMax());
// 最小值
System.out.println(summaryStatistics.getMin());
// 求和
System.out.println(summaryStatistics.getSum());
// 平均值
System.out.println(summaryStatistics.getAverage());
// 数量
System.out.println(summaryStatistics.getCount());
}
/**
* 自定义流
*/
@Test
public void supplier() {
/**
* 自定义用户流处理类
*
* @author CL
*
*/
class UserSupplier implements Supplier<User> {
private Integer index = 1;
private String[] names = new String[] { "张三", "李四", "王五" };
private Random random = new Random();
@Override
public User get() {
return new User(index++, names[index - 2],
new BigDecimal(random.nextDouble() * 1000).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
}
}
Stream.generate(new UserSupplier()).limit(3).collect(Collectors.toList()).forEach(System.out::println);
}
}
/**
* 用户类
*
* @author CL
*
*/
class User {
/**
* ID
*/
private Integer id;
/**
* 用户名
*/
private String name;
/**
* 工资
*/
private Double salary;
public User() {
super();
}
public User(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public User(Integer id, String name, Double salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", salary=" + salary + "]";
}
}
3. 日期处理
Java 8 新特性:Lambda、Stream和日期处理的更多相关文章
- Java 8 新特性之 Stream 流基础体验
Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...
- Java 8 新特性 - Lambda表达式
Lambda表达式 vs 匿名类既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析.一个关键的不同点就是关键字 this.匿名类的 this 关键字指向匿名类 ...
- Java 8新特性之Stream(八恶人-3)
“You John Ruth The Hangman” 绞刑者鲁斯·约翰 “When the Hangman catches you, you hang.”当被绞刑者抓住了,你肯定会被绞死 一.基本介 ...
- Java8 新特性 Lambda & Stream API
目录 Lambda & Stream API 1 Lambda表达式 1.1 为什么要使用lambda表达式 1.2 Lambda表达式语法 1.3 函数式接口 1.3.1 什么是函数式接口? ...
- 浅析Java 8新特性Lambda Expression
什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...
- Java 8新特性----Lambda
Lambda 一.如何辨别Lambda表达式 Runnable noArguments = () -> System.out.println("Hello World"); ...
- java 8 新特性之Stream的排序/分类
Stream简介 Stream是Java8提供的一个新的API,它位于java.util.stream包下.Stream API提供了一种新的方式来对Java集合进行操作,这种操作方式极大的提高了Ja ...
- Java 8新特性--Lambda表达式作为返回值
lambda表达式作为方法的返回值:
- Java 8 新特性--Lambda表达式作为方法参数
Lambda表达式的使用场景: 当方法的参数是一个函数式接口时,可以使用Lambda表达式进行简化—— 首先,前提是Runnable接口是一个函数式接口,经过查看源码得知,确实如此: 将Runnabl ...
- Java 8 新特性-Stream更优雅的处理集合入门
Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...
随机推荐
- IAR设置字体
1.IAR设置字体 第一种方法可以在IDE环境下,选择Tools -> option -> Editor - > Colors and Fonts,然后右边的Editor Font就 ...
- 从 Webpack 到 Snowpack, 编译速度提升十倍以上——TRPG Engine迁移小记
动机 TRPG Engine经过长久以来的迭代,项目已经显得非常臃肿了.数分钟的全量编译, 每次按下保存都会触发一次10s到1m不等的增量编译让我苦不堪言, 庞大的依赖使其每一次编译都会涉及很多文件和 ...
- 还不懂Java高并发的,建议看看这篇阿里大佬的总结,写的非常详细
前言 进程是计算机中程序关于某几何数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位.是操作系统结构的基础 线程可以说是轻量级的进程,是程序执行的最小单位,使用多线程而不用多进程去进行并发程 ...
- MathType总结编辑括号的类型(上)
括号的种类有很多,我们用得也很多,可以说无处不见,不只是在数学物理这些自然科学的公式中来断地出现括号,即使是在人文艺术类的领域也会有括号的出现.下面就和小编一起来看看公式编辑器编辑括号的类型吧! Ma ...
- ABBYY FineReader 15新增智能PDF文档转换功能
ABBYY FineReader 15(Windows系统)新增智能PDF文档转换功能,可自动检测导入PDF数字文档的文本层质量,确保转变为可编辑格式后的准确结果:从表单字段和文本框中提取文本,准确保 ...
- 几分钟看懂EasyRecovery数据恢复原理,比我想象的简单易懂得多
可能很多人知道使用数据恢复软件EasyRecovery可以恢复丢失的数据,但是却不知道它是什么原理.现在我们就以硬盘数据恢复为例,一起来了解下EasyRecovery数据恢复原理. 当硬盘数据丢失后, ...
- 目前工作中用到的linux命令
crontab -e 查看并且编辑定时脚本命令 每一分钟执行一次脚本,并且写入log */1 * * * * php /var/www/api/cron/Mission/setMeetingDone ...
- Java基础教程——泛型
泛型 Generics:泛型,愿意指"无商标的". 泛型,可以理解为"宽泛的数据类型",就是将类型由原来的具体的类型泛化. 泛型在建立对象时不指定类中属性的具体 ...
- Python是什么?
Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年. 像 Perl ...
- Qt5字符串编码转换学习
目录 1.通过Python3示例探索常用字符串编码 UTF8 ANSI Unicode 小结 2.Qt5中使用QTextCodec进行编码转换 小结 1.通过Python3示例探索常用字符串编码 下面 ...