Stream流

发布时间 2023-08-29 22:48:11作者: lmcool-

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]))