使用步骤:①流水线放数据--->②中间方法--->③终结方法(最后一个方法)
①流水线放数据![](https://i-blog.csdnimg.cn/blog_migrate/bf45769dc7758c42b23a9548012f3462.png)
单列集合:
//获取流水线并放数据可以简化代码为:
list.stream().forEach(s -> System.out.println(s));
双列集合:
两种办法:①:分别获取单列再获取stream流 ②:获取键值对
数组
零散数据:(但数据必须是相同类型)
也可以传递引用类型的数组,但不能传递基本数据类型的数组
Stream.of(1,2,3,4,5).forEach(s->System.out.println(s));
②中间方法
//过滤
list.stream()
.filter(s ->s.startsWith("张"))
.forEach(s-> System.out.println(s));
//获取前几个
list.stream()
.limit(3)
.forEach(s-> System.out.println(s));
//跳过前几个,输出后面的
list.stream()
.skip(3)
.forEach(s-> System.out.println(s));
跳过前两个,输出剩下中的前三个
list.stream()
.skip(2)
.limit(2)
.forEach(s-> System.out.println(s));
综合练习
package Nov1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;
public class test1 {
public static void main(String[] args) {
//法一
//创建一个集合,存储多个字符串元素
ArrayList<String> list1 = new ArrayList<String>();
Collections.addAll(list1,"A","B","C","D","E","F");
//需求1:取前4个数据组成一个流
Stream<String> s1 = list1.stream().limit(4);
//需求2:跳过2个数据组成一个流
Stream<String> s2 = list1.stream().skip(2);
//需求3:合并需求1和需求2得到的流,并把结果在控制台输出(要求字符串元素不能重复)
Stream.concat(s1,s2).distinct().forEach(s-> System.out.print(s));
//法二
System.out.println();
System.out.println("==============================================");
ArrayList<String> list3 = new ArrayList<String>();
Collections.addAll(list3,"A","B","C","D","E","F");
ArrayList<String> list4 = new ArrayList<String>();
Collections.addAll(list4,"Q","B","W","D","T","F");
Stream.concat(list3.stream(),list4.stream()).distinct().forEach(s-> System.out.print(s));
}
}
类型转换
<String, Integer>分别代表原本数据类型和要转后的类型;
parseInt()为转换int的方法 ;
简写为λ后如下:
③终结方法
调用终结方法之后就不能调用其他的方法了
遍历与收集
收集流中数据放入数组中
重写是为了放入指定类型的数组当中,而不是Object;
Arrays.toString() 是转为字符串输出;
[value]指定数组长度;
改为λ表达式
收集流中数据放入数组中
List不去重
s.split("-")[1] 从“-”处将字符串一分为二,[1]就是第二个字符,判断该字符是否为“男”;
Set去重
Map
package Nov1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class test2 {
public static void main(String[] args) {
//法一
//创建一个集合,存储多个字符串元素
ArrayList<String> list1 = new ArrayList<String>();
Collections.addAll(list1,"A-y-1","B-n-2","C-y-3","D-y-4","E-n-5","F-y-6");
Map<String, Integer> map = list1.stream()
.filter(s -> "y".equals(s.split("-")[1]))
.collect(Collectors.toMap(new Function<String, String>() {
//toMap(a,b)中,a为键的生成规则;b为值的生成规则
//a部分的<String,String>分别代表流中每个数据的数据类型 和 Map集合中键的数据类型
//第一个String对应下面重写里(public String apply(String s))String s的String
//第二个String对应下面重写里(public String apply(String s))String apply的String
//后面第二个重写同理,只不过将键换成值
@Override
public String apply(String s) {
//apply的形参s代表流里面的每一个数据
//apply的方法体为:生成键;返回值为 已经生成的键
return s.split("-")[0];
}
},
new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")[2]); //注意把字符串转为整数
}
}));
System.out.println(map);
}
}
转为λ表达式:
ArrayList<String> list1 = new ArrayList<String>();
Collections.addAll(list1,"A-y-1","B-n-2","C-y-3","D-y-4","E-n-5","F-y-6");
Map<String, Integer> map = list1.stream()
.filter(s -> "y".equals(s.split("-")[1]))
.collect(Collectors.toMap(
s->s.split("-")[0],
s->Integer.parseInt(s.split("-")[2])
));
System.out.println(map);