title: Stream流
index_img: https://tuchuangs.com/imgs/2023/08/09/02d7f67db46abe4c.png
tags:
- Java SE
categories:
- Java SE
hide: false
excerpt: Stream流、得到流、中间方法、终结方法案例
问题描述
- 先把所有以“张”开头的元素存储到新集合中
- 再把“张”开头的,长度为3的元素再存储到新集合中
- 遍历最终结果
传统方式
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张无忌");
list.add("张三丰");
list.add("赵敏");
list.add("张凯");
System.out.println("list:" + list);
ArrayList<String> list1 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("张")) {
list1.add(s);
}
}
System.out.println("list1:" + list1);
ArrayList<String> list2 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("张") && s.length() == 3) {
list2.add(s);
}
}
System.out.println("list2:" + list2);
}
}
Stream流
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张无忌");
list.add("张三丰");
list.add("赵敏");
list.add("张凯");
list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).forEach(name -> System.out.println(name));
}
}
Stream流
结合lambda和链式编程
得到Stream流
获取方式 | 方法名 | 说明 |
---|---|---|
单列集合 | default Stream |
collection中的默认方法 |
双列集合 | 无 | 无法直接使用stream流(通过键或键值对) |
数组 | public static |
Arrays工具类中的静态方法 |
一堆零散数据 | public static |
Stream接口中的静态方法 |
使用中间方法
Stream |
过滤 |
---|---|
Stream |
获取前几个元素 |
Stream |
跳过前几个元素 |
Stream |
元素去重,依赖(hashCode和equals方法)[重写] |
static |
合并a和b两个流为一个流[合并流的数据类型时它们的父类类型] |
Stream |
转换流中的数据类型 |
使用终结方法
名称 | 说明 |
---|---|
forEach(Consumer action) | 遍历流中的每个元素,并对每个元素执行指定的操作。 |
count() | 返回流中元素的数量。 |
toArray() | 将流中的所有元素收集到一个数组中。 |
collect(Collector collector) | 使用提供的Collector,将流中的数据收集到一个集合中。 |
得到案例
单列集合
可直接使用Stream流
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //使用工具类添加数据
//一般会使用链式编程
System.out.println(list.stream().filter(num -> num % 2 == 0).count());//6
}
}
双列集合
可通过键或键值对获得
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>(); //无序
map.put("张三", 1);
map.put("里斯", 2);
map.put("王五", 3);
map.put("张开", 4);
//方式1:通过键获得
map.keySet().stream().filter(name -> name.startsWith("张")).forEach(s -> System.out.println(s + "-" + map.get(s)));
System.out.println("--------------");
//方式2:通过键值对获得
map.entrySet().stream().filter(name -> name.getKey().startsWith("张"))
.forEach(s -> System.out.println(s.getKey() + "-" + s.getValue()));
}
}
数组
- 可通过Arrays的静态方法获得
- 基本类型和引用类型都支持
public class Main {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4};
String[] arr2 = {"java","Stream"};
Arrays.stream(arr1).forEach(s -> System.out.println(s));
System.out.println("------------");
Arrays.stream(arr2).forEach(s-> System.out.println(s));
}
}
零散数据
- Stream接口中的静态方法
- 这些数据需要时相同类型
public class Main {
public static void main(String[] args) {
Stream.of(1, 2, 3, 4, 5).filter(num -> num <= 3).forEach(s -> System.out.println(s)); //of支持可变参数,也可以传递引用数据的数组[数组还是推荐使用工具类]
}
}
中间方法使用案例
public class Main {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//过滤
list.stream().filter(num -> num > 5).forEach(s -> System.out.println(s));
System.out.println("------------------");
//限制元素
list.stream().limit(5).forEach(s -> System.out.println(s));
System.out.println("------------------");
//跳过元素个数
list.stream().skip(5).forEach(s -> System.out.println(s));
System.out.println("------------------");
//去重
List<Integer> listWithDuplicates = Arrays.asList(1, 1, 2, 2, 3, 3);
listWithDuplicates.stream().distinct().forEach(s -> System.out.println(s));
System.out.println("------------------");
//合并流
Stream<Integer> stream1 = Stream.of(1, 2, 3);
Stream<Integer> stream2 = Stream.of(4, 5, 6);
Stream.concat(stream1, stream2).forEach(s -> System.out.println(s));
System.out.println("------------------");
//类型转换
list.stream().map(num -> "" + num).forEach(s -> {
if (s instanceof String) {
System.out.println(s + "现在是String类型");
}
});
}
}
终结方法
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
//遍历
list.stream().forEach(s -> System.out.println(s));
System.out.println("---------");
//统计
System.out.println(list.stream().count());
System.out.println("----------");
//存到数组
String[] array = list.stream().toArray(s -> new String[s]);
Arrays.stream(array).forEach(s -> System.out.println(s));
System.out.println("----------");
//存到集合
List<String> collect = list.stream().collect(Collectors.toList());
System.out.println(collect);
}
}