java8 Stream新特性
import lombok.Getter;
import lombok.Setter; @Setter
@Getter
public class Person {
private String name; // 姓名
private int salary; // 薪资
private int age; // 年龄
private String sex; //性别
private String area; // 地区 // 构造方法
public Person(String name, int salary, int age,String sex,String area) {
this.name = name;
this.salary = salary;
this.age = age;
this.sex = sex;
this.area = area;
}
}
import lombok.extern.slf4j.Slf4j; import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream; @Slf4j
public class StreamTest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1,6,6,8);
List<Person> personList = new ArrayList<Person>();
personList.add(new Person("Tom", 8900, 23, "male", "New York"));
personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
personList.add(new Person("Anni", 8200, 24, "female", "New York"));
personList.add(new Person("Owen", 9500, 25, "male", "New York"));
personList.add(new Person("Alisa", 7900, 26, "female", "New York"));
personList.add(new Person("koukay", 9500, 26, "male", "New York"));
personList.add(new Person("houkay", 7800, 28, "male", "New York")); /*maxLength();
more6Print(list, 6);
findFirst(list);
more6(list);
less6(list);
more7();
findPerson(personList);
maxValue();
maxSalary(personList);
more6Count(list);
upperCaseAdd3();
addSalary(personList);
splitList();
calculate();
sumAndMax(personList);
collectTo(list,personList);
operate(personList);
group(personList);
join(personList);
collectReducing(personList);
sort(personList);
*/
distinctAndSkip();
listMapOrder();
}
/**
* mapList排序
*/
private static void listMapOrder(){
List<Map<String,Double>> comments= new ArrayList<>();
for (int i = 0; i <10; i++) {
Map<String,Double> map= new HashMap<>();
map.put("DateStr",Math.random());
comments.add(map);
} List<Map<String, Double>> collect = comments.stream().sorted(Comparator.comparing(StreamTest::comparingByData)).collect(Collectors.toList());
for (Map<String, Double> stringObjectMap : collect) {
System.out.println(stringObjectMap.get("DateStr"));
}
}
private static Double comparingByData(Map<String,Double> map){
return map.get("DateStr");
}
/**
* 流合并、去重、限制、跳过等操作。
*/
private static void distinctAndSkip(){
String[] arr1 = { "a", "b", "c", "d" };
String[] arr2 = { "d", "e", "f", "g" };
Stream<String> stream1 = Arrays.stream(arr1);
Stream<String> stream2 = Arrays.stream(arr2); // concat:合并两个流 distinct:去重
List<String> collect1 = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList()); // limit:限制从流中获得前n个数据
List<Integer> collect2 = Stream.iterate(1, x -> x + 2).limit(5).collect(Collectors.toList());
// skip:跳过前n个数据
List<Integer> collect3 = Stream.iterate(1, x -> x + 2).skip(2).limit(5).collect(Collectors.toList());
System.out.println("合并去重的结果为: "+collect1);
System.out.println("取出前五个数据: "+collect2);
System.out.println("跳过前两个数据: "+collect3);
} /**
* sorted,中间操作。有两种排序:
*
* sorted():自然排序,流中元素需实现Comparable接口
* sorted(Comparator com):Comparator排序器自定义排序
*/
private static void sort(List<Person> personList){
// 按工资增序排序
List<String> collect1 = personList.stream().sorted(Comparator.comparing(Person::getSalary)).map(Person::getName).collect(Collectors.toList());
// 按工资倒序排序
List<String> collect2 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed()).map(Person::getName).collect(Collectors.toList());
// 先按工资再按年龄自然排序(从小到大)
List<String> collect3 = personList.stream().sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge)).map(Person::getName).collect(Collectors.toList());
// 先按工资再按年龄自定义排序(从大到小)
List<String> collect4 = personList.stream().sorted((p1, p2) -> {
if (p1.getSalary() == p2.getSalary()) {
return p2.getAge() - p1.getAge();
} else {
return p2.getSalary() - p1.getSalary();
}
}).map(Person::getName).collect(Collectors.toList());
//先按工资再按年龄倒序
List<String> collect5 = personList.stream().sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge)).map(Person::getName).collect(Collectors.toList());
// 先按工资再按年龄自定义排序(从大到小)
System.out.println("按工资增序排序: "+collect1);
System.out.println("按工资倒序排序: "+collect2);
System.out.println("先按工资再按年龄自然排序(从小到大): "+collect3);
System.out.println("先按工资再按年龄自定义排序(从大到小): "+collect4);
System.out.println("先按工资再按年龄倒序: "+collect5); } /**
* Collectors类提供的reducing方法,相比于stream本身的reduce方法,增加了对自定义归约的支持。
*/
private static void collectReducing(List<Person> personList){
// 每个员工减去起征点后的薪资之和
Optional<Integer> reduce = personList.stream().map(p -> p.getSalary() - 5000).reduce(Integer::sum);
Integer collect = personList.stream().collect(Collectors.reducing(0, Person::getSalary, (x, y) -> (x + y - 5000)));
System.out.println("员工扣税薪资总和1:" + reduce.get());
System.out.println("员工扣税薪资总和2:" + collect); } /**
* joining可以将stream中的元素用特定的连接符(没有的话,则直接连接)连接成一个字符串。
*/
private static void join(List<Person> personList){
String collect = personList.stream().map(Person::getName).collect(Collectors.joining("--"));
System.out.println("所有成员姓名为: "+collect);
List<String> list = Arrays.asList("A", "B", "C");
String collect1 = list.stream().collect(Collectors.joining("*"));
System.out.println("拼接后的字符串为: "+collect1);
} /**
* 将员工按薪资是否高于8000分为两部分;将员工按性别和地区分组
*/
private static void group(List<Person> personList){
// 将员工按薪资是否高于8000分组
Map<Boolean, List<Person>> collect = personList.stream().collect(Collectors.partitioningBy(p -> p.getSalary() > 8000));
Map<Boolean, List<Person>> collect3 = personList.stream().collect(Collectors.groupingBy(p -> p.getSalary() > 8000));
// 将员工按性别分组
Map<String, List<Person>> collect1 = personList.stream().collect(Collectors.groupingBy(Person::getSex));
// 将员工先按性别分组,再按地区分组
Map<String, Map<String, List<Person>>> collect2 = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));
System.out.println("员工按薪资是否大于8000分组情况:" + collect);
System.out.println("员工按薪资是否大于8000分组情况:" + collect3);
System.out.println("员工按性别分组情况:" + collect1);
System.out.println("员工按性别、地区:" + collect2);
} /**
* 统计员工人数、平均工资、工资总额、最高工资。
*/
private static void operate(List<Person> personList){
//员工人数
Long collect = personList.stream().collect(Collectors.counting());
//平均工资
Double collect1 = personList.stream().collect(Collectors.averagingDouble(p -> p.getSalary()));
//工资总额
Double collect2 = personList.stream().collect(Collectors.summingDouble(Person::getSalary));
//最高工资
Optional<Integer> collect3 = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));
DoubleSummaryStatistics collect4 = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));
log.info("员工人数为: {}, 平均工资为: {}, 工资总额为: {}, 最高工资为: {}, 查询工资所有为: {}",collect,collect1,collect2,collect3,collect4); }
private static void collectTo(List<Integer> list, List<Person> personList){
List<Integer> collect1 = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
Set<Integer> collect2 = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
Map<String, Person> collect = personList.stream().filter(p -> p.getSalary() > 8000).collect(Collectors.toMap(Person::getName, p -> p));
System.out.println(collect1);
System.out.println(collect2);
System.out.println(collect);
} /**
* 求所有员工的工资之和和最高工资。
*/
private static void sumAndMax(List<Person> personList){
//员工工资之和方式一
Optional<Integer> reduce = personList.stream().map(Person::getSalary).reduce((p1, p2) -> p1 + p2);
//员工工资之和方式二
Integer reduce1 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(), (sum1, sum2) -> sum1 + sum2);
//员工工资之和方式三
Optional<Integer> reduce2 = personList.stream().map(Person::getSalary).reduce(Integer::sum);
//员工工资之和方式四
Integer reduce3 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(), Integer::sum); //员工工资最高值一
Optional<Integer> reducemax1 = personList.stream().map(Person::getSalary).reduce(Integer::max);
//员工工资最高值二
Optional<Integer> reducemax2 = personList.stream().map(Person::getSalary).reduce((s1,s2)->s1>s2?s1:s2);
//员工工资最高值三
Integer reduce4 = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(), Integer::max);
Integer reduce5 = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary() ,(max1,max2)->max1>max2?max1:max2);
log.info("员工工资之和1为: {},员工工资之和2为: {},员工工资之和3为: {},员工工资之和4为: {}",reduce.get(),reduce1,reduce2.get(),reduce3);
log.info("员工工资最高值1: {},员工工资最高值2: {},员工工资最高值3: {},员工工资最高值4: {}",reducemax1.get(),reducemax2.get(),reduce4,reduce5);
} /**
* 求Integer集合的元素之和、乘积和最大值。
*/
private static void calculate(){
List<Integer> list = Arrays.asList(1, 3, 2, 8, 11, 4);
// 求和方式1
Optional<Integer> reduce = list.stream().reduce((x, y) -> x + y);
// 求和方式2
Optional<Integer> reduce1 = list.stream().reduce(Integer::sum);
// 求和方式3
Integer reduce2 = list.stream().reduce(0, Integer::sum);
log.info("求和方式1: {}, 方式2: {}, 方式3: {}",reduce.get(),reduce1.get(),reduce2);
// 求乘积
Optional<Integer> reduce3 = list.stream().reduce((x, y) -> x * y);
log.info("求乘积为: {}",reduce3.get());
// 求最大值方式1
Optional<Integer> reduce4 = list.stream().reduce((x, y) -> x > y ? x : y);
// 求最大值方式1
Optional<Integer> reduce5 = list.stream().reduce(Integer::max);
log.info("求最大值方法1: {},方式2: {}",reduce4.get(),reduce5.get());
} /**
* 将两个字符数组合并成一个新的字符数组。
*/
private static void splitList(){
List<String> list = Arrays.asList("m,k,l,a", "1,3,5,7");
List<String> collect = list.stream().flatMap(str -> {
String[] split = str.split(",");
return Arrays.stream(split);
}).collect(Collectors.toList());
System.out.println(list);
System.out.println(collect);
} /**
* 将员工的薪资全部增加1000。
* @param personList
*/
private static void addSalary(List<Person> personList){
List<Person> collect = personList.stream().map((person) -> {
person.setSalary(person.getSalary() + 1000);
return person;
}).collect(Collectors.toList());
collect.forEach(person -> {
log.info("{}调薪后的工资为{}",person.getName(),person.getSalary());
});
} /**
* 英文字符串数组的元素全部改为大写。整数数组每个元素+3。
*/
private static void upperCaseAdd3(){
String[] strArr = { "abcd", "bcdd", "defde", "fTr" };
List<Integer> intList = Arrays.asList(1, 3, 5, 7, 9, 11);
List<String> collect1 = Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());
List<Integer> collect = intList.stream().map(x -> x + 3).collect(Collectors.toList()); collect1.forEach(a->{
log.info("每个元素大写-> "+a);
});
collect.forEach(a->{
log.info("每个元素+3-> "+a);
}); }
private static void more6Count(List<Integer> list){
long count = list.stream().filter(x -> x > 6).count();
log.info("大于6的元素有{}个",count);
}
private static void maxSalary( List<Person> personList ){
Optional<Person> max = personList.stream().max(Comparator.comparing(Person::getSalary));
System.out.println("姓名: "+max.get().getName()+"--------工资 "+max.get().getSalary());
}
private static void maxValue(){
List<Integer> list = Arrays.asList(7, 6, 9, 4, 11, 6); //自然排序
Optional<Integer> max = list.stream().max(Integer::compareTo);
//自定义排序
Optional<Integer> max1 = list.stream().max(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
System.out.println("自然排序的最大值:" + max.get());
System.out.println("自定义排序的最大值:" + max1.get()); }
/**
* 获取String集合中最长的元素
*/
private static void maxLength(){
List<String> list = Arrays.asList("adnm", "admmt", "potjhgfdsatfd", "xbangd", "weoujgsd");
Optional<String> max = list.stream().max(Comparator.comparing(String::length));
System.out.println(max.get()); }
/**
* 遍历输出符合条件的元素 大于6
* @param list
* @param i
*/
private static void more6Print(List<Integer> list, int i) {
list.stream().filter(x -> x > i).forEach(System.out::println);
} /**
* 匹配第一个
* @param list
*/
private static void findFirst(List<Integer> list) {
Optional<Integer> first = list.stream().filter(x -> x > 6).findFirst();
System.out.println("匹配第一个大于6的数-> "+first.get());
} /**
* // 匹配任意(适用于并行流)大于6
* @param list
*/
private static void more6(List<Integer> list) {
Optional<Integer> any = list.parallelStream().filter(x -> x > 6).findAny();
System.out.println("匹配任意(适用于并行流)大于6-> "+any.get());
} /**
* // 是否包含符合特定条件的元素 小于6
* @param list
*/
private static void less6(List<Integer> list) {
boolean b = list.stream().anyMatch(x -> x < 6);
System.out.println("是否包含小于6的元素-> "+b);
}
/**
* //筛选出Integer集合中大于7的元素,并打印出来
*/
private static void more7() {
List<Integer> list2 = Arrays.asList(6, 7, 3, 8, 1, 2, 9);
more6Print(list2, 7);
} /**
* 筛选员工中工资高于8000的人,并形成新的集合
*/
public static void findPerson(List<Person> personList){ personList.stream().filter(p -> p.getSalary() > 8000).collect(Collectors.toList()).forEach((t)->{
System.out.println("姓名: "+t.getName()+"--------工资 "+t.getSalary());
});
}
}
java8 Stream新特性的更多相关文章
- Java8 Stream新特性详解及实战
Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...
- 简单了解JAVA8的新特性
JAVA8新特性会颠覆整个JAVA程序员的编程习惯 甚至如果您坚守JAVA7之前的编程习惯,今后你看比较年轻的程序员写的JAVA代码都会无法理解 所以为了保证不脱钩,我觉得有必要学习JAVA8的新特性 ...
- java8的新特性以及用法简介
1. 介绍 2 接口的默认方法 2 lambda表达式 2.1 函数式接口 2.2 方法与构造函数引用 2.3 访问局部变量 2.4 访问对象字段与静态变量 3. 内建函数式接口 3.1 Predic ...
- Java8常用新特性实践
前言: 时下Oracle开速迭代的Java社区以即将推出Java10,但尴尬的是不少小中企业仍使用JDK7甚至JDK6开发. 从上面列出的JDK8特性中我们可以发现Java8的部分特性很明显的是从Sc ...
- 深度分析:java8的新特性lambda和stream流,看完你学会了吗?
1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ...
- Java8的新特性以及与C#的比较
函数式接口 VS 委托 在C中,可以使用函数指针来存储函数的入口,从而使得函数可以像变量一样赋值.传递和存储,使得函数的调用变得十分灵活,是实现函数回调的基础.然而函数指针不存在函数的签名信息,甚至可 ...
- java5、java6、java7、java8的新特性
Java5: 1.泛型 Generics: 引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...
- Java8部分新特性的学习
Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它 ...
- java7与java8的新特性
java7 新特性: 1. switch 里面的 case 条件可以使用字符串了. 2. 运用 List\tempList = new ArrayList<>(); 即泛型实例化类型自动判 ...
随机推荐
- 自学java如何快速地达到工作的要求?
自学java如何快速地达到工作的要求,是很多初学者都比较关心的问题,对于初学者来说,盲目自学不但不能快速入门,还会浪费大量的时间. 今天知了堂就来分享自学Java如何快速达到找工作的要求. 1.自学J ...
- mycat实现主从读取中的问题
schema.xml 中的配置如下:..... <dataHost name="aaa" maxCon="2000" minCon="100&q ...
- 无需debug,通过抽象模型快速梳理代码核心流程
上一篇我们通过DSM来确定了核心对象并构建了抽象模型.本篇是<如何高效阅读源码>专题的第八篇,我们来基于抽象模型来梳理核心流程. 本节主要内容: 如何通过抽象模型来梳理核心流程 从类名和注 ...
- 深入理解Kafka核心设计及原理(四):主题管理
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/16124354.html 目录: 4.1创建主题 4.2 优先副本的选举 4.3 分区重分配 4.4 如何选择合 ...
- Java学习day30
线程分为用户线程和守护线程,虚拟机必须确保用户线程执行完毕,虚拟机不用等待守护线程执完毕 并发:同一个对象被多个线程同时操作,例如上万了同时抢100张票,手机银行和柜台同时取同一张卡里的钱 处理多线程 ...
- OpenHarmony 3.1 Beta版本关键特性解析——探秘隐式查询
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 徐浩 隐式查询是 OpenAtom OpenHarmony(以下简称"OpenHarmony" ...
- Java语言学习day06-7月05日
今日内容介绍流程控制语句之循环语句循环高级###10for循环_1 * A: for循环_1 * a: 使用格式 for(初始化变量 ; 条件 ; 增量){ 循环体; } * b: 各模块解释 初始化 ...
- nodejs的TCP相关的一些笔记
TCP协议 基于nodejs创建TCP服务端 TCP服务的事件 TCP报文解析与粘包解决方案 一.TCP协议 1.1TCP协议原理部分参考:无连接运输的UDP.可靠数据传输原理.面向连接运输的TCP ...
- Amazing!巧用 CSS 视差实现酷炫交互动效
本文将介绍利用 CSS 实现滚动视差效果的一个小技巧,并且,利用这个技巧来制作一些有意思的交互特效. 关于使用 CSS 实现滚动视差效果,在之前有一篇文章详细描述过具体方案 - CSS 实现视差效果, ...
- Python获取文件夹下的所有文件名
1 #获取文件夹内的图片 2 import os 3 def get_imlist(path): 4 return [os.path.join(path,f) for f in os.listdir( ...