Stream 流
1 介绍
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 主要用于集合操作,极大的简化了代码,同时支持链式编程。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
public interface Stream<T> extends BaseStream<T, Stream<T>> {}
1.1 获取Stream流
在 Java 8 中, 集合接口有两个方法来生成流:
- stream() − 为集合创建串行流。
- parallelStream() − 为集合创建并行流。
public class Stream01 {
/*
在 Java 8 中, 集合接口有两个方法来生成流:
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。
*/
public static void main(String[] args) {
//代码演示:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
//获取stream流
Stream<Integer> stream = list.stream();
/*ArrayList arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
arrayList.add(5);
arrayList.add(6);
Stream stream1 = arrayList.stream();*/
}
}
1.2 Stream的forEach方法
遍历
/**
* 需求:过滤出集合中的非空字符串,并以集合返回
*/
public class Stream_Collectors_toLis{
public static void main(String[] args) {
List<String> strings = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
//过滤非空字符串,先打印看看
strings.stream().filter(s->s.isEmpty()).forEach(System.out::println);
//将过滤的结果转为集合:collect(Collectors.toList())
List<String> collect = strings.stream()
.filter(s->s.isEmpty())
.collect(Collectors.toList());
//其他方法
List<String> stringss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
//把过滤后的结果转为 逗号 拼接的字符串
String collect1 = stringss.stream().filter(s -> s.isEmpty()).collect(Collectors.joining(","));
//-------------------------
List<String> stringsss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
//统计非空元素的个数
long count = stringsss.stream().filter(s -> s.isEmpty()).count();
}
}
1.3 Stream的map方法
map函数的作用就是针对管道流中的每一个数据元素进行转换操作。
/**
* 需求1:求集合中每个元素的平方,并打印。
*/
public class Stream_map {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
//使用map方法实现:map()允许传入一个函数式接口Function的实现
//该接口 泛型1:表示传入参数类型,泛型2:表示返回值类型
/*list.stream().map(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer t) {
return t*t;
}
});*/
//lambda表达式
list.stream().map(t -> t * t).forEach(System.out::println);
/**
* 需求2:获得集合中每个人的名字,并打印。
*/
List<People> list1 = Arrays.asList(new People("张三", 18), new People("李四", 19));
//这里的p在调用方法getName,所以是特殊情况,可以使用静态方法的方式
list1.stream().map(People::getName).forEach(System.out::println);
}
}
class People{
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "people{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
1.4 Stream的filter方法
过滤
/**
* 需求:打印大于3的数
*/
public class Stream_filter {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
//使用 filter() 过滤方法实现
/* list.stream().filter(new Predicate<Integer>() {
@Override
public boolean test(Integer t) {
return t>3; //过滤条件
}
});*/
list.stream().filter(t -> t >= 3).forEach(System.out::println);
}
}
1.5 Stream的 limit方法 和 skip方法
limit:截取前n个;
skip:去掉前n个;
public class Stream_limit_Or_skip {
public static void main(String[] args) {
/**
* 需求:截取前N个元素,limit(n)
*/
//需求:截取前3个, 结果:1,2,3
List<Integer> list = Arrays.asList(1,2,3,4,5,6);
list.stream().limit(3).forEach(System.out::println);
/**
* 需求:去掉前N个元素,skip(n)
*/
//需求:去掉前3个, 结果:4,5,6
List<Integer> list1 = Arrays.asList(1,2,3,4,5,6);
list1.stream().skip(3).forEach(System.out::println);
/**
* 需求:打印除了第一个和最后一个以外的元素
*/
List<Integer> list2 = Arrays.asList(1,2,3,4,5,6);
list2.stream().limit(5).skip(1).forEach(System.out::println);
}
}
1.6 Stream的 sorted方法
排序
public class Stream_sorted {
public static void main(String[] args) {
/**
* 需求:对元素进行排序
*/
//默认是:升序
List<Integer> list = Arrays.asList(3, 2, 1, 4, 5, 6);
list.stream().sorted().forEach(System.out::println);
//自定义排序规则
list.stream().sorted((o1, o2)-> o2-o1).forEach(System.out::println);
}
}
1.7 Stream的 distinct 方法
/**
* 需求:去除重复元素
*/
public class Stream_distinct {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,1,2,2,4,5,6);
//去重
list.stream().distinct().forEach(System.out::println);
}
}
1.8 将流重新转为集合
/**
* 需求:过滤出集合中的非空字符串,并以集合返回
*/
public class Stream_Collectors_toLis{
public static void main(String[] args) {
List<String> strings = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
//过滤非空字符串,先打印看看
strings.stream().filter(s->s.isEmpty()).forEach(System.out::println);
//将过滤的结果转为集合:collect(Collectors.toList())
List<String> collect = strings.stream()
.filter(s->s.isEmpty())
.collect(Collectors.toList());
//其他方法
List<String> stringss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
//把过滤后的结果转为 逗号 拼接的字符串
String collect1 = stringss.stream().filter(s -> s.isEmpty()).collect(Collectors.joining(","));
//-------------------------
List<String> stringsss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
//统计非空元素的个数
long count = stringsss.stream().filter(s -> s.isEmpty()).count();
}
}
我亦无他,惟手熟尔