(六)jdk8学习心得之Stream流
六、Stream流
1、 什么是stream流
现阶段,可以把stream流看成一个高级版的Iterator。普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了。而这个stream可以实现一些遍历常见的功能(例如:非空、求最大值、遍历打印等)
2、 效率高吗?
采用lazy模式(懒处理模式),所有操作最后一起执行,在一次循环中结束。
3、 创建stream流
1) list集合
list对象.stream()即可
2) 数组
Arrays.stream(数组对象)
或者
Stream.of(数组对象)
4、 常见的方法

例如:
package com.lennar.jdk8learn.learn;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class LeanStream {
@Test
public void test1() {
List<String> list
= new ArrayList<>();
String[] strings = new String[10];
for (int i = 0; i < 10; i++) {
list.add(String.valueOf(i));
strings[i]
= String.valueOf(i);
}
//创建流stream
Stream listStream
= list.stream();
Stream arrayStream
= Arrays.stream(strings);
Stream arrayStream2
= Stream.of(strings);
//forEach遍历方法
listStream.forEach(System.out::println);
System.out.println("---------------");
arrayStream.forEach(System.out::println);
System.out.println("---------------");
arrayStream2.forEach(System.out::println);
System.out.println("---------------");
}
@Test
public void test2() {
Student student1 = new Student("1", "张三", "唐山");
Student student2 = new Student("2", "李四", "唐山");
Student student3 = new Student("3", "王五", "北京");
Student student4 = new Student("4", "赵六", "杭州");
List<Student> list
= new ArrayList<>();
list.add(student1);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
//collect方法:将Steam流转换成list、set、map
List<Student> newList
= list.stream().collect(Collectors.toList());
System.out.println(newList);
Set<Student> set = list.stream().collect(Collectors.toSet());//去重
System.out.println(set);
//Collectors.toMap(获取key的方法,获取value的方法,key相同时的方法)
Map<String, Student> map = list.stream().collect(Collectors.toMap(Student::getName, student -> student, (k1, k2) -> k1));//name作key,student对象作value,键相同则取前者。
System.out.println(map);
Map<String, Student> map2 = list.stream().collect(Collectors.toMap(Student::getId, student -> student, (k1, k2) -> k1));
System.out.println(map2);
Map<String, Student> map3 = list.stream().collect(Collectors.toMap(Student::getAddress, student ->
student, (k1, k2)
-> k2));
System.out.println(map3);
//Collectors.groupingBy(获取分组key的方法)
Map<String, List<Student>>
groupMap = list.stream().collect(Collectors.groupingBy(Student::getId));
System.out.println(groupMap);
Map<String, List<Student>>
groupMap2 = list.stream().collect(Collectors.groupingBy(Student::getName));
System.out.println(groupMap2);
Map<String, List<Student>>
groupMap3 = list.stream().collect(Collectors.groupingBy(Student::getAddress));
System.out.println(groupMap3);
//最大max(里面本质就是一个Comparator的方法)、最小min(里面本质就是一个Comparator的方法)
//Comparator.comparing(获取要比较的属性的方法)
Optional<Student> minStudentOptional = list.stream().min(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return -o1.getId().compareTo(o2.getId());
}
});
Student minStudent = minStudentOptional.get();
System.out.println("min:" + minStudent);
Optional<Student> maxStudentOptional = list.stream().max(Comparator.comparing(Student::getId));
Student maxStudent = maxStudentOptional.get();
System.out.println(maxStudent);
//排序sorted(里面本质就是一个Comparator的方法)
List<Student> students
= list.stream().sorted(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return -o1.getId().compareTo(o2.getId());
}
}).collect(Collectors.toList());
System.out.println(students);
List<Student> students2
= list.stream().sorted(Comparator.comparing(Student::getId)).collect(Collectors.toList());
System.out.println(students2);
//过滤filter(里边返回一个boolean类型数据就行)
List<Student> filterList
= list.stream().filter(student
-> {
boolean flag = false;
if (!student.getAddress().equals("唐山")) {
flag = true;
} else {
if (!student.getId().equals("1")) {
flag = true;
}
}
return flag;
}).collect(Collectors.toList());
System.out.println(filterList);
//limit(n),仅仅研究前n个
List<Student> limitList
= list.stream().limit(2).collect(Collectors.toList());
System.out.println(limitList);
//skip(n),跳过前n个
List<Student> skipList
= list.stream().skip(2).collect(Collectors.toList());
System.out.println(skipList);
//distict(),去重
List<Student> distinctList
= list.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList);
//map(把原内容变成新内容的方法)
List<String> nameList
= list.stream().map(student
-> student.getName()).collect(Collectors.toList());
System.out.println(nameList);
//allMatch(匹配方法lambda表达式),都匹配返回true;对每一个元素判断,最后取交集
Boolean f1 = list.stream().allMatch(student
-> {
boolean flag = false;
if (null == student.getName()) {
flag = true;
}
return flag;
});
System.out.println(f1);
//anyMatch(匹配方法lambda表达式),有元素匹配返回true;对每一个元素判断,最后取交集
boolean f2 = list.stream().anyMatch(student
-> {
boolean flag = false;
if ("张三".equals(student.getName())) {
flag = true;
}
return flag;
});
System.out.println(f2);
//noneMatch(匹配方法lambda表达式),都不匹配返回true;对每一个元素判断,最后取交集
boolean f3 = list.stream().noneMatch(student
-> {
boolean flag = false;
if ("唐山".equals(student.getAddress())) {
flag = true;
}
return flag;
});
System.out.println(f3);
}
@Test
public void test3() {
List<Integer> list
= new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
IntSummaryStatistics collect = list.stream().collect(Collectors.summarizingInt(value -> value));
System.out.println(collect.getSum());
System.out.println(collect.getMax());
System.out.println(collect.getMin());
System.out.println(collect.getAverage());
System.out.println(collect.getCount());
List<Double> list2
= new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list2.add((double) i);
}
DoubleSummaryStatistics collect2 = list2.stream().collect(Collectors.summarizingDouble(value -> value));
System.out.println(collect2.getSum());
System.out.println(collect2.getMax());
System.out.println(collect2.getMin());
System.out.println(collect2.getAverage());
System.out.println(collect2.getCount());
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Student {
private String id;
private String name;
private String address;
}
(六)jdk8学习心得之Stream流的更多相关文章
- JDK8新特性关于Stream流
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...
- (一)jdk8学习心得之遍历
一.遍历 -- 最好和stream流连用 使用jdk8提供的forEach进行遍历时,采用的是多线程的操作,理论上讲是会比原来的方法更快.但是注意,系统启动时需要加载lambda框架的内容.因此如果通 ...
- Lambda学习总结(二)--Stream流
一.Stream 流 1.1 概念 官方解释:可以支持顺序和并行对元素操作的元素集合. 简单来讲,Stream 就是 JDK8 提供给我们的对于元素集合统一.快速.并行操作的一种方式. 它能充分运用多 ...
- (七)jdk8学习心得之join方法
七.join方法 1. 作用:将list或者数组按照连接符进行连接,返回一个字符串. 2. 使用方法 1) String.join(“连接符”,数组对象或者list对象) 2) 首先转换成stream ...
- JDK8新特性之Stream流
是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...
- 20165221—JAVA第六周学习心得
课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...
- (八)jdk8学习心得之Optional类
八.Optional 类 1. 作用:可以存放空指针null,主要用于解决空指针问题. 2. 使用方法 1) 创建对象(2种方法) Optional optional = Optional.of(非n ...
- (五)jdk8学习心得之默认方法
五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...
- (四)jdk8学习心得之函数式接口
四.函数式接口 1. 格式 注:抽象方法就是通过lambda表达式或者方法引用实现. 2. Jdk提供的函数式接口(这里提供五个最为常用的) 3. 技巧 通过函数式接口,就可以把一个函数作为一个参数进 ...
随机推荐
- 【Android Studio安装部署系列】二十、Android studio如何将so文件添加到svn中
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在使用android studio的过程中,常常会遇到一个头疼的问题,添加的so,居然无法被svn添加. 选项都是灰的: 那这种问题 ...
- 使用java语言,将字符串中连续重复出现的字母变成“出现次数“+字母的格式
今天在简书上看到这样一道有趣的算法题: 解题思路 首先定义一个变量element,默认是字符串的第一个字符.以element为基准元素,去判断某个字符是否重复.然后再去定义一个变量count去记录重复 ...
- 微信公众号开发C#系列-2、微信公众平台接入指南
概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- 1.Memcached 中文文档 - 概论(译官方文档)
原文地址:memcached手册 https://github.com/memcached/memcached/wiki/Overview 简介 Free & open source, ...
- Springboot 系列(十三)使用邮件服务
在我们这个时代,邮件服务不管是对于工作上的交流,还是平时的各种邮件通知,都是一个十分重要的存在.Java 从很早时候就可以通过 Java mail 支持邮件服务.Spring 更是对 Java mai ...
- rabbitmq高级消息队列
rabbitmq使用 什么是消息队列 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以很复杂,可以包含嵌入对象. 消息队列是一种应用间的通信方式,消息发送后 ...
- 【网摘】EasyUI常用控件禁用启用方法
1.validatebox可以用的用法:前两种适用于单个的validatebox; 第三种应用于整个form里面的输入框; <1>.$("#id").attr(&quo ...
- 【网摘】C#.NET 在 MVC 中动态绑定下拉菜单的方法
1. 已知下拉菜单列表项: 在 Controller 控制器类中输入已下代码 1 public class DemoController : Controller 2 { 3 public ...
- jQuery(四)、文档处理
1 内部插入 1.1 append(content | fn) 向每个匹配的元素内部追加内容. 参数: (1) content:要追加到目标中的内容. (2) function(index, html ...