Stream流的使用-用于数据集的过滤、映射
1、生成流的操作:通过数据源、集合生成流list.stream()
2、中间操作:一个流可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤、映射,然后返回一个新的流,交给接下来的流使用;filter()
3、终极操作:后续就无法再使用这个流了,foreach()
Stream流的生成方式
生成流实例
//Collection体系的集合可以使用默认方法stream()生成流
List<String> li = new ArrayList<String>();
Stream<String> listream = li.stream();
Set<String> hstr = new HashSet<>();
Stream<String> hstrstream = hstr.stream();
//Map体系的方法间接生成流
Map<String,Integer> map = new HashMap<String,Integer>();
Stream<String> keystream = map.keySet().stream();
Stream<Integer> valstream = map.values().stream();
Stream<Map.Entry<String, Integer>> entstream = map.entrySet().stream();
//数据可以通过Stream接口的静态方法of(T...value)生成流
String[] atrarray={
"ss","3dd","dssd"};
Stream<String> atrstream = Stream.of(atrarray);
Stream<String> atrstream1 = Stream.of("sdsd", "dsds", "deee");
Stream<Integer> integerStream = Stream.of(12, 32, 232, 33);
Stream流常见的中间操作方法
1、Stream filter(Predicate<? super T> predicate)
返回由与此给定谓词匹配的此流的元素组成的流
2、Stream limit(long maxSize)
返回由此流的元素组成的流,截短长度不能超过 maxSize
3、Stream skip(long n)
在丢弃流的第一个 n元素后,返回由该流的剩余元素组成的流。
4、static Stream concat(Stream<? extends T> a, Stream<? extends T> b)
创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。
是一个静态方法,将两个流合并
5、distinct()
返回由该流的不同元素(根据 Object.equals(Object) )组成的流。
6、Stream sorted()
返回由此流的元素组成的流,根据自然顺序排序
Stream sorted(Comparator<? super T> comparator)
返回由该流的元素组成的流,根据提供的 Comparator进行排序。
7、 Stream map(Function<? super T,? extends R> mapper)
返回由给定函数应用于此流的元素的结果组成的流。
8、IntStream mapToInt(ToIntFunction<? super T> mapper)
返回一个 IntStream其中包含将给定函数应用于此流的元素的结果。
IntStream中还有Stream中没有的sum等方法
List<String> list = new ArrayList<String>();
list.add("21");
list.add("3322");
list.add("322");
list.add("32234");
list.add("3233");
list.add("3783");
//把list集合以3开头的数字输出
list.stream().filter(s -> s.startsWith("3")).forEach(System.out::println);
System.out.println("---");
//把list集合以3开头且长度为4的数字输出
list.stream().filter(s -> s.startsWith("3")).filter(s -> s.length() ==4 ).forEach(System.out::println);
System.out.println("---");
//取前4个
Stream<String> s1 = list.stream().limit(4);
// 跳过前2个取后面的数
Stream<String> s2 = list.stream().skip(2);
// 合并流
// Stream.concat(s1,s2).forEach(System.out::println);
//合并流并且不重复
Stream.concat(s1,s2).distinct().forEach(System.out::println);
Stream流的常见终结操作:for each、count
1、void forEach(IntConsumer action)
对此流的每个元素执行操作。
2、long count()
返回此流中的元素数。
Stream流的收集操作collect
对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中。
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
//需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));