Stream流
获取Stream流
- 流
- 作用:结合了lambda表达式,简化集合,数组操作
- 使用步骤
- 先得到一条stream流并把数据放上去
- 利用stream流中的API进行各种操作
- 中间方法:过滤,转换
- 终结方法:统计,打印
ArrayList<String> list1 = new ArrayList<>();
list1.add("张三丰");
list1.add("张文远");
list1.add("张辽");
list1.add("李四");
ArrayList<String> list2 = new ArrayList<>();
for(String name:list1){
if(name.startsWith("张")){
list2.add(name);
}
}
System.out.println(list2);
单列集合获取stream流
//单列集合获取stream流
ArrayList<String> list3 = new ArrayList<>();
Collections.addAll(list3,"张三丰","张文远","李四","张辽");
Stream<String> stream1 = list3.stream();
stream1.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//简写
list3.stream().forEach(s -> System.out.println(s));
Collection中的默认方法获取单列集合,双列集合无法直接使用stream流
双列集合获取stream流
HashMap<String,Integer> hm = new HashMap<>();
hm.put("aaa",1);
hm.put("bbb",2);
hm.put("ccc",3);
hm.put("ddd",4);
hm.keySet().stream().forEach(s-> System.out.println(s));
//aaa
//ccc
//bbb
//ddd
//第二种
hm.entrySet().stream().forEach(s-> System.out.println(s));
//aaa=1
//ccc=3
//bbb=2
//ddd=4
数组
int[] arr = {1,2,3,4,5,6};
Arrays.stream(arr).forEach(s-> System.out.print(s));//123456
数组引用数据类型
String[] arr2 = {"aaa","bbb"};
Arrays.stream(arr2).forEach(s-> System.out.print(s));//aaabbb
零散数据(同种数据类型)
Stream.of(1,2,3,4,5).forEach(s-> System.out.print(s));//12345
Stream.of("a","b","c","d","e").forEach(s-> System.out.print(s));//abcde
of是可变参数,底层是数组
stream接口中静态方法of的细节
方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中
int[] arr = {1,2,3,4,5,6};
String[] arr2 = {"aaa","bbb"};
Stream.of(arr).forEach(s-> System.out.println(s));//[I@41629346
Stream.of(arr2).forEach(s-> System.out.println(s));//aaabbb
中间方法
-
中间方法,返回新的stream流,原来的流只能用一次,建议使用链式编程
-
修改流中的数据不会影响原来集合或数组中的数据
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张");
}
}).forEach(s-> System.out.println(s));
list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s));
Stream<String> stream1 = list.stream().filter(s->s.startsWith("张"));
Stream<String> stream2 = stream1.filter(s->s.length()==3);
stream2.forEach(s-> System.out.println(s));
stream1就没了,stream1已经关闭
流只能用一次,就不用变量接收了,可以链式编程
.limit(3)只要前三个
.skep(4)跳过前4个
.distinct()去重,依赖hashcode和qeuals方法
.concat合并a和b两个流为一个,两个流的数据类型尽量一致,否则会进行类型的提升,把两个流中的数据类型换成更高的
.map()转化流中的数据类型
"张无忌-15",获取int 15
list.stream().map(s->Integer.aprseInt(s.split("-")[1])).foreach(s->sout(s))
终结方法
foreach()遍历
(int) .count()统计
toArray()收集放到数组中
collect()收集放到集合中
Object[] arr = list.stream().toArray();
System.out.println(Arrays.toString(arr));
//[张三丰, 张文远, 李四, 张辽]
String arr = list.stream().toArray(value->new String[value]);
.collect(Collectors,toList())//收集到list
.collect(Collectors,toliet())//收集到Set,set会自动去重
收集到map:
确定谁作为键谁作为值:
list.stream().filter().collect(Collector.toMap(参数1键的生成规则,参数2值的生成规则new function))
map键不能重复
list.stream().filter().collect(Collector.toMap(s->s.split("-")[0],s->Integer.parseInt(s.split("-")[2]))
标签:Stream,stream,System,forEach,println,out
From: https://www.cnblogs.com/lmcool/p/stream.html