stream流的思想
类似于流水线,
每一次流操作基本分为以下三步
-
创建一个流,
-
对流使用中间进行操作(过滤,转换),
-
使用终结方法(统计,打印,收集)对流中数据进行操作三步stream流获取
stream流获取
获取方式 | 方法名 | 说明 |
---|---|---|
单列集合(list set ) | .stream() | collection的默认方法 |
双列集合(map) | 无 | 无法直接使用stream流 |
数组 | Array.stream() | Arrays工具类中的静态方法 |
一堆零散数据 | Stream.of() | Stream接口中的静态方法 |
单列结合获取stream
// List获取stream流
ArrayList<String> list = new ArrayList<>();
list.add("11");
list.add("22");
list.add("33");
list.add("44");
list.add("55");
Stream<String> stream1 = list.stream();
// 匿名内部类
stream1.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
// lambda表达式
list.stream().forEach(s -> System.out.println(s));
结果:
双列集合获取stream
先将双列集合变为单列集合
-
entrySet
-
keySet
// 创建双列集合
HashMap<String, Integer> map = new HashMap<>();
map.put("aa", 111);
map.put("bb", 222);
map.put("cc", 333);
map.put("dd", 444);
map.put("ee", 555);
// map获取stream流
// 先将map 变为单列
Set<Map.Entry<String, Integer>> entries = map.entrySet();
// 然后将entry变成流
// 匿名内部类
entries.stream().forEach(new Consumer<Map.Entry<String, Integer>>() {
@Override
public void accept(Map.Entry<String, Integer> stringIntegerEntry) {
System.out.println(stringIntegerEntry);
}
});
System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
// lambda表达式
map.entrySet().stream().forEach(s -> System.out.println(s));
// keySett获取流并使用匿名内部类打印
map.keySet().stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s + "==");
System.out.println(map.get(s));
}
});
System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
// keySett获取流并使用lambda表达式打印
map.keySet().stream().forEach(s -> {
System.out.println(s);
System.out.println(map.get(s));
});
结果:
数组获取stream 流
可以使用工具类中Arrays中的静态方法Arrays.stream()来生成stream流
、
// 创建数组
int[] array = {1, 2, 3, 4, 5, 6, 7};
// 获取stream流
// 使用lambda表达式
Arrays.stream(array).forEach(s -> System.out.println(s));
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tQRG35pj-1675586258850)(F:/study/image-20230205112833336.png)]
一堆零散数据获取sream流
Stream.of(1, 2, 3, 4, 5).forEach(s -> System.out.println(s));
System.out.println("***************------------------------");
Stream.of("a", "a", "a", "a", "a").forEach(s -> System.out.println(s));
结果:
中间方法
filter | 过滤 |
---|---|
limit | 获取前几个元素 |
skip | 跳过前几个元素 |
distinst | 元素去重 |
concat | 合并a和b两个流为一个流 |
map | 转换流中的数据类型 |
HashMap<String, Integer> map = new HashMap<>();
map.put("aa", 111);
map.put("ab", 222);
map.put("ac", 333);
map.put("bd", 444);
map.put("be", 555);
map.keySet().stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s));
System.out.println("------------------------------------------------");
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四s");
list.add("李五");
list.add("张四");
list.add("张四");
list.add("张哼");
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
System.out.println("----------------------------------");
list.stream().filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
System.out.println("----------------------------------");
list.stream().skip(2).forEach(s -> System.out.println(s));
list.stream().filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
System.out.println("----------------------------------");
list.stream().distinct().forEach(s -> System.out.println(s));
System.out.println("----------------------------------");
Stream.concat( list.stream().filter(s -> s.startsWith("张")),list.stream().distinct()).forEach(s -> System.out.println(s));
System.out.println("----------------------------------");
List<Object> list1 = list.stream().map(s -> {
if (s.startsWith("张")) {
s = s + "牛逼666";
}
return s;
}).collect(Collectors.toList());
for (Object o : list1) {
System.out.println(o);
}