JAVA8流操作
* Stream 的三个操作步骤:
* 1创建Stream
* 2中间操作
* 3终止操作
package airycode_java8.nice6; import airycode_java8.nice1.Employee;
import org.junit.Test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; /**
* Stream 的三个操作步骤:
* 1创建Stream
* 2中间操作
* 3终止操作
* Created by admin on 2019/1/3.
*/
public class TestStream { @Test
public void test1(){
//1.通过Collection集合提供的stream()或者parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//2.数组
Employee[]emps = new Employee[10];
Stream<Employee> stream2 = Arrays.stream(emps);
//3.stream中的静态方法
Stream.of("aa","bb","cc"); //4.创建无限流
//迭代
Stream<Integer> stream = Stream.iterate(0, (x) -> x + 2);
stream.limit(10).forEach(System.out::println); //生成
Stream.generate(()->Math.random()).limit(5).forEach(System.out::println); } }
中间操作:
package airycode_java8.nice6; import airycode_java8.nice1.Employee;
import org.junit.Test; import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; /**
* 中间操作
*
* Created by admin on 2019/1/3.
*/
public class TestStreamApi2 { //准备数据
static List<Employee> employeeList = Arrays.asList(
new Employee("张三",18,9999.99, Employee.Status.FREE),
new Employee("李四",38,5555.55,Employee.Status.BUSY),
new Employee("王五",50,6666.66,Employee.Status.VOCATION),
new Employee("赵六",16,3333.33,Employee.Status.FREE),
new Employee("田七",8,7777.77,Employee.Status.BUSY)
);
/***
* 筛选与切片
* filter--接收Lambda,从流中排除某些元素。
* limit--截断流,使其元素不超过给定数量
* skip(n)--跳过元素,返回扔掉了前n个元素的流,若流中不足n个,则返回一个空流,与limit互补
* distinct--筛选,通过流所生成的元素的hashcode和equals去除重复元素
*/
//内部迭代:由StreamAPI提供
@Test
public void test1(){
//中间操作:不会做任何的操作
Stream<Employee> stream1 = employeeList.stream().filter((e) -> e.getAge() > 35);
//终止操作:一次性执行全部,就是“惰性求值”
stream1.forEach(System.out::println);
} @Test
public void test2(){
//中间操作:不会做任何的操作
Stream<Employee> stream1 = employeeList.stream().filter((e) -> e.getAge() > 35).limit(1);
//终止操作:一次性执行全部,就是“惰性求值”
stream1.forEach(System.out::println);
} @Test
public void test3(){
//中间操作:不会做任何的操作
Stream<Employee> stream1 = employeeList.stream().filter((e) -> e.getAge() > 35).skip(1);
//终止操作:一次性执行全部,就是“惰性求值”
stream1.forEach(System.out::println);
} //去重必须重写hashcode和equals
@Test
public void test4(){
//中间操作:不会做任何的操作
Stream<Employee> stream1 = employeeList.stream().filter((e) ->e.getSalary()>5000).skip(2).distinct();
//终止操作:一次性执行全部,就是“惰性求值”
stream1.forEach(System.out::println);
}
}
中间操作2:
package airycode_java8.nice6; import airycode_java8.nice1.Employee;
import org.junit.Test; import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; /**
* 中间操作
*
* Created by admin on 2019/1/3.
*/
public class TestStreamApi3 { //准备数据
static List<Employee> employeeList = Arrays.asList(
new Employee("张三",18,9999.99, Employee.Status.FREE),
new Employee("李四",38,5555.55,Employee.Status.BUSY),
new Employee("王五",50,6666.66,Employee.Status.VOCATION),
new Employee("赵六",16,3333.33,Employee.Status.FREE),
new Employee("田七",8,7777.77,Employee.Status.BUSY)
);
/***
* 映射
* map--接收Lambda,将元素转换成其他形式或提取信息,接收一个函数作为参数,该函数会被应用到每一个元素上,并将其映射成一个新的元素
* flatMap--接收一个函数作为参数,将流中的,每一个值换成另一个流,然后把所有流链接成一个流
*/
//内部迭代:由StreamAPI提供
@Test
public void test1(){
List<String> list = Arrays.asList("aaa","bbb","ccc","ddd");
list.stream().map((str)->str.toUpperCase()).forEach(System.out::println);
System.out.println("------------------------");
employeeList.stream().map((employee -> employee.getName())).forEach(System.out::println);
} //map对比flatMap
@Test
public void test2(){
List<String> list = Arrays.asList("aaa","bbb","ccc","ddd");
Stream<Stream<Character>> charStream = list.stream().map(TestStreamApi3::filterChar);
charStream.forEach((sm)->{
sm.forEach(System.out::println);
}); } //flatMap
@Test
public void test3(){
List<String> list = Arrays.asList("aaa","bbb","ccc","ddd");
list.stream().flatMap(TestStreamApi3::filterChar).forEach(System.out::println); } public static Stream<Character> filterChar(String str){
List<Character> list = new ArrayList<>();
for (Character c:str.toCharArray()) {
list.add(c);
} return list.stream();
} }
中间操作-排序
package airycode_java8.nice6; import airycode_java8.nice1.Employee;
import org.junit.Test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; /**
* 中间操作--排序
*
* Created by admin on 2019/1/3.
*/
public class TestStreamApi4 { //准备数据
static List<Employee> employeeList = Arrays.asList(
new Employee("张三",18,9999.99, Employee.Status.FREE),
new Employee("李四",38,5555.55,Employee.Status.BUSY),
new Employee("王五",50,6666.66,Employee.Status.VOCATION),
new Employee("赵六",16,3333.33,Employee.Status.FREE),
new Employee("田七",8,7777.77,Employee.Status.BUSY)
);
/***
* 排序
* sorted()-自然排序
* sorted(Comparator com)--定制排序
*/
@Test
public void test1(){
List<String> list = Arrays.asList("fff","aaa","bbb","ccc","ddd");
list.stream().sorted().forEach(System.out::println);
System.out.println("---------------------");
employeeList.stream().sorted((e1,e2)->{
if (e1.getAge() == e2.getAge()) {
return e1.getName().compareTo(e2.getName());
} else {
return -Integer.compare(e1.getAge(),e2.getAge());
}
}).forEach(System.out::println);
} }
终止操作:
package airycode_java8.nice6; import airycode_java8.nice1.Employee;
import org.junit.Test; import java.util.Arrays;
import java.util.List;
import java.util.Optional; /**
* 终止操作
*
* Created by admin on 2019/1/3.
*/
public class TestStreamApi5 { //准备数据
static List<Employee> employeeList = Arrays.asList(
new Employee("张三",18,9999.99, Employee.Status.FREE),
new Employee("李四",38,5555.55,Employee.Status.BUSY),
new Employee("王五",50,6666.66,Employee.Status.VOCATION),
new Employee("赵六",16,3333.33,Employee.Status.FREE),
new Employee("田七",8,7777.77,Employee.Status.BUSY) );
/***
* 终止操作
* 查找与匹配
* allMatch--检查是否匹配所有元素
* anyMatch--检查是否至少匹配一个元素
* noneMatch--检查是否没有匹配所有元素
* findFirst--返回第一个元素
* findAny--返回当前流中的任意一个元素
* count--返回流中元素总个数
* max--返回流中最大值
* min--返回流中最小值
*
*
*/
@Test
public void test1(){
boolean allMatch = employeeList.stream().allMatch((employee -> employee.getStatus().equals(Employee.Status.BUSY)));
System.out.println(allMatch); boolean anyMatch = employeeList.stream().anyMatch((employee -> employee.getStatus().equals(Employee.Status.BUSY)));
System.out.println(anyMatch); boolean noneMatch = employeeList.stream().noneMatch((employee -> employee.getStatus().equals(Employee.Status.BUSY)));
System.out.println(noneMatch); Optional<Employee> op = employeeList.stream().sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())).findFirst();
Employee employee = op.get();
System.out.println(employee); System.out.println("-------------------------");
Optional<Employee> anyOp = employeeList.stream().filter((e) -> e.getStatus().equals(Employee.Status.FREE)).findAny();
System.out.println(anyOp.get());
} @Test
public void test2(){
long count = employeeList.stream().count();
System.out.println(count);
Optional<Employee> max = employeeList.stream().max((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(max.get());
Optional<Employee> min = employeeList.stream().min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(min.get()); Optional<Double> min1 = employeeList.stream().map(Employee::getSalary).min(Double::compare);
System.out.println(min1.get());
} }
终止操作:规约
package airycode_java8.nice6; import airycode_java8.nice1.Employee;
import org.junit.Test; import java.util.*;
import java.util.stream.Collectors; /**
* 终止操作
*
* Created by admin on 2019/1/3.
*/
public class TestStreamApi6 { //准备数据
static List<Employee> employeeList = Arrays.asList(
new Employee("张三",18,9999.99, Employee.Status.FREE),
new Employee("李四",38,5555.55,Employee.Status.BUSY),
new Employee("王五",50,6666.66,Employee.Status.VOCATION),
new Employee("赵六",16,3333.33,Employee.Status.FREE),
new Employee("田七",8,7777.77,Employee.Status.BUSY) );
/***
* 规约
* reduce(T identity,BinaryOperator)--可以将流中元素反复结合起来,得到一个值
*
*
*/
@Test
public void test1(){
List<Integer> list = Arrays.asList(1,2,3,4,5);
Integer sum = list.stream().reduce(0, (x, y) -> x + y);
System.out.println(sum);
System.out.println("-----------------------");
Optional<Double> reduceOp = employeeList.stream().map(Employee::getSalary).reduce(Double::sum);
System.out.println(reduceOp.get());
} /***
* 收集
* collect--将流转化为其他的形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
*/ @Test
public void test2(){
List<String> names = employeeList.stream().map(Employee::getName).collect(Collectors.toList());
names.forEach(System.out::println); Set<String> disNames = employeeList.stream().map(Employee::getName).collect(Collectors.toSet());
disNames.forEach(System.out::println); System.out.println("----------------");
HashSet<String> hashNames = employeeList.stream().map(Employee::getName).collect(Collectors.toCollection(HashSet::new));
hashNames.forEach(System.out::println);
} @Test
public void test3(){
//总数
Long count = employeeList.stream().collect(Collectors.counting());
System.out.println(count); //平均数
Double avg = employeeList.stream().collect(Collectors.averagingDouble(Employee::getSalary));
System.out.println(avg); //总和
Double sum = employeeList.stream().collect(Collectors.summingDouble(Employee::getSalary));
System.out.println(sum); //最大值员工
Optional<Employee> employeeMax = employeeList.stream().collect(Collectors.maxBy((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())));
System.out.println(employeeMax.get()); //最小值
Optional<Double> val = employeeList.stream().map(Employee::getSalary).collect(Collectors.minBy(Double::compare));
System.out.println(val.get());
} //分组
@Test
public void test4(){
Map<Employee.Status, List<Employee>> statusListMap = employeeList.stream().collect(Collectors.groupingBy(Employee::getStatus));
System.out.println(statusListMap);
} //多级分组
@Test
public void test5(){
Map<Employee.Status, Map<String, List<Employee>>> map = employeeList.stream().collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((employee) -> {
if (employee.getAge() <= 35) {
return "青年";
} else if (employee.getAge() <= 50) {
return "中年";
} else {
return "老年";
}
})));
System.out.println(map);
} //分区
@Test
public void test6(){
Map<Boolean, List<Employee>> booleanListMap = employeeList.stream().collect(Collectors.partitioningBy((e) -> e.getSalary() > 8000)); System.out.println(booleanListMap);
} //获取最大值,求和,最小值,另一种方式
@Test
public void test7(){
DoubleSummaryStatistics dss = employeeList.stream().collect(Collectors.summarizingDouble(Employee::getSalary)); System.out.println(dss.getSum());
System.out.println(dss.getAverage());
System.out.println(dss.getCount());
System.out.println(dss.getMax());
System.out.println(dss.getMin());
} //连接字符换
@Test
public void test8(){
String str = employeeList.stream().map(Employee::getName).collect(Collectors.joining("-"));
System.out.println(str);
} }
JAVA8流操作的更多相关文章
- java8 流操作
0 创建流 public void test1(){ List<String> list = new ArrayList<>(); Stream<String> ...
- java8 流操作 好文网址
api 各方法详解(很不错!) http://blog.51cto.com/turnsole/2093185 api 各方法 简介: https://www.cnblogs.com/guguli/p/ ...
- 【java多线程】java8的流操作api和fork/join框架
原文:https://blog.csdn.net/u011001723/article/details/52794455/ 一.测试一个案例,说明java8的流操作是并行操作 1.代码 package ...
- Java8中的流操作-基本使用&性能测试
为获得更好的阅读体验,请访问原文:传送门 一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿 ...
- Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系
1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...
- 公子奇带你进入Java8流的世界(二)
在上一篇中我们带领大家简单的了解流的概念及使用场景,本节我们就来好好的介绍流的常见用法. 一.筛选和切片 对于一串流,我们有时需要取出我们需要的流中某些元素,主要是通过谓词筛选.看代码: 首先定义一个 ...
- 侠说java8--Stream流操作学习笔记,都在这里了
前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...
- 全面吃透JAVA Stream流操作,让代码更加的优雅
全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...
- Node学习笔记(一):stream流操作
NodeJs中谈及较多的可能就是Stream模块了,先写一个简单的ajax回调 $.post("index.php",{data:'aaa',order:'ccc'},functi ...
随机推荐
- Dotnetbar中如何让LabelX自动换行
把LableX标签控件的WordWrap属性设置为true. https://zhidao.baidu.com/question/207858423.html 另外lable控件可以设置AutoSiz ...
- 广播消费:允许一个 Group ID 所标识的所有 Consumer 都会各自消费某条消息一次。
什么是消息队列 RocketMQ?_消息队列 RocketMQ-阿里云 https://help.aliyun.com/document_detail/29532.html 2019-01-30 16 ...
- dbtool部署
dbtool工具部署 a.附件解压到/home/oracle/dbtool b.执行以下命令chmod 755 /home/oracle/dbtool/*.shecho "alias dbt ...
- Java线程的状态分析
线程状态 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于“可运行线程池”中,变得可运行,只 ...
- linux 拷贝软连接文件
cp -s sourchfile targetfile 这样拷贝软连接文件时,会将其对应指定路径同步修改,即便原来的软连接是相对路径也不会有问题.
- linux内存不足,swap交换分区创建
为什么需要swap 根 据Redhat公司的建议,Linux系统swap分区最适合的大小是物理内存的1-2倍.不过Linux上有些软件对swap分区得需求较大,例如要顺 利执行Oracle数据库软件, ...
- ubuntu编译opencv3.1遇到的问题
网上有很多关于编译的具体步骤,我也是按照网上的说明一步步操作的,这里主要想记录的是在安装完之后,import cv2不存在以及其他的libopencv_hdf.so.3.1等找不到的问题,如果将这样的 ...
- SpringBoot-热部署Devtools
热部署 什么是热部署 所谓的热部署:比如项目的热部署,就是在应用程序在不停止的情况下,实现新的部署 项目演示案例 @RestController @Slf4j public class IndexCo ...
- linux命令学习:PATH and LDFLAGS and CFLAGS
CFLAGS 表示用于 C 编译器的选项, CXXFLAGS 表示用于 C++ 编译器的选项. 这两个变量实际上涵盖了编译和汇编两个步骤. 先来看几个相关的环境变量:PATH.LDFLAGS. ...
- 使用 HTMLTestRunner 模块生成HTML格式的测试报告文件
1.下载HTMLTestRunner.py HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展.它生成易于使用的 HTML 测试报告.HTMLTestRunne ...