Stream流
-
java 8 中的流,其实就是Stream接口的对象
-
JDK提供了一个流接口:java.util.stream.Stream
-
如何获取流
-
根据集合获取流:集合名.stream()
ArrayList<String> list = new ArrayList<String>();
Stream<String> streamA = list.stream();
-
根据数组获取流:Stream.of(数组名)
String[] str = {"hello","word","java"};
Stream<String> streamB = Stream.of(str);
-
-
处理流的三种方法
-
map(用于转换的Lambda表达式)
映射
映射:就是将一个对象转换成另一个对象,把老对象映射到新对象上//转换成int类型 ArrayList<String> list = new ArrayList<String>(); list.add("100"); list.add("200"); list.add("300"); list.add("400"); //转换成int类型 Stream<Integer> stream = list.stream().map(Integer::valueOf); ArrayList<String> list1 = new ArrayList<String>(); list1.add("赵一,96"); list1.add("钱二,91"); list1.add("孙三,82"); list1.add("李四,90"); //切分并获取[0]号元素 list.stream().map(str -> str.split(",")[0]);
-
filter(能产生Boolean结果的Lambda表达式)
过滤(筛选)
如果参数Lambda产生了true,则保留元素;如果产生了false,则丢弃元素ArrayList<Integer> list = new ArrayList<Integer>(); list.add(100); list.add(200); list.add(30); list.add(40); //过滤出大于100的值 list.stream().filter(i -> i > 100); ArrayList<String> list1 = new ArrayList<String>(); list1.add("赵一"); list1.add("钱二"); list1.add("孙三"); list1.add("李四"); //过滤出李四 list1.stream().filter(str -> str.equals("李四"));
-
forEach(Lambda表达式)
遍历
意思是对元素的每个元素都进行操作
参数Lambda表达式必须是一个能够消费(使用)一个参数,且不产生结果(没有返回值)的lambda表达式(方法引用)
例如:以下两个语句效果完全相同
list.stream().forEach(str -> System.out.println(str)); //lambda表达式
list.stream().forEach(System.out::println); //方法引用
//遍历打印集合 ArrayList<String> list = new ArrayList<String>(); list.add("赵一"); list.add("钱二"); list.add("孙三"); list.add("李四"); list.stream().forEach(System.out::println);
-
-
Stream流综合联系
ArrayList<String> list = new ArrayList<String>(); list.add("赵一,96"); list.add("钱二,91"); list.add("孙三,82"); list.add("李四,90"); //输出大于等于90的成绩,输出结果必须是int类型 list.stream().map(str -> str.split(",")[1]).map(Integer::parseInt).filter(i -> i >= 90).forEach(System.out::println);
-
并发的Stream流
-
流当中的元素如果特别多,那么只有一个人在逐一处理,比较慢
-
如果对流中的元素多人同时处理,这就是并发
-
获取并发流的方法
集合名.parallelStream()
集合名.stream().parallel()
Stream.of(数组名).parallel()
-
可以直接获取并发流,获取并发流的方法1;
-
当已经获取了一个普通的流,调用parallel()方法也会变为并发流
-
只要使用正确不会发生多个人抢到同一元素的情况
例
public class StreamTestStreamParallel { public static void main(String[] args) { // TODO 自动生成的方法存根 ArrayList<String> list = new ArrayList<String>(); for(int i = 0;i < 100;i++) list.add("HelloWord-"+i); //list.parallelStream().forEach(System.out::println); //无序的,说明并发执行,获取方法1 //list.stream().parallel().forEach(System.out::println); //无序的,说明并发执行,获取方法2 String[] str = new String[100]; for(int i = 0;i < 100;i++) str[i] = "HelloWord-"+i; //Stream.of(str).parallel().forEach(System.out::println); //无序的,说明并发执行,获取方法3 Integer[] ints = new Integer[100]; for(int i = 0;i < 100;i++) ints[i] = i+1; Stream.of(ints).parallel().forEach(System.out::println); } }
-