java stream

本文详细介绍了Java 8中Stream流的创建方式,包括数组、Collection、BufferedReader等,以及各种创建示例和转换技巧,如过滤、映射、排序、分组、并行处理等,涵盖了典型应用场景和实用方法,如数据处理、列表操作和复杂数据结构转换。
摘要由CSDN通过智能技术生成

Stream流的创建方式

  • 数组

    1. Arrays.stream(T array);
    2. stream.of(array)
  • Collection

    1. Collection.stream()
    2. Collection.parallelStream()
  • BufferedReader

    1. java.io.BufferedReader.lines()
  • 静态工厂

    1. java.util.stream.IntStream.range()
    2. java.nio.file.Files.walk()
  • 自己构建

    1. java.util.Spliterator
  • 其他

    1. Random.ints()
    2. BitSet.stream()
    3. Pattern.splitAsStream(java.lang.CharSequence)
    4. JarFile.stream()

创建示例

//数组
String[] array = new String[]{"1","2","3"};
Arrays.stream(array);
Stream.of(array);
Stream.of(1, 2, 3);
//集合
List<String> list = Arrays.asList(array);
list.stream();
list.parallelStream();
//数值,目前只支持IntStream、LongStream、DoubleStream三种
IntStream.of(new int[]{1,2,3}).forEach(System.out::println);
IntStream.range(1,3).forEach(System.out::println);
IntStream.rangeClosed(1, 3).forEach(System.out::println);

流转换为其它数据结构

Stream stream = Stream.of("1","2","3");
//Array
String[] array2=(String[]) stream.toArray(String[]::new);
//Collection
List<String> list1=(List)stream.collect(Collectors.toList());
List<String> list2=(List)stream.collect(Collectors.toCollection(ArrayList::new));
Set set=(Set)stream.collect(Collectors.toSet());
Stack stack=(Stack)stream.collect(Collectors.toCollection(Stack::new));
//String
String str = stream.collect(Collectors.joining()).toString();

经典用法

1. 将一个List中元素的某一属性取出来作为一个list,并做过滤

List<Long> names=  users.stream().filter(Objects::nonNull).map(User::getId).collect(Collectors.toList());
//或者
List<Long> names1=
 users.stream().filter(Objects::nonNull).map(u->u.getId()).collect(Collectors.toList());
//遍历list
names.forEach(System.out::println);

2. 将List转换成Map

		//key:id value:name
		Map<Long, String> map = users.stream().collect(Collectors.toMap(p -> p.getId(), p -> p.getName()));
			//或者,第三个参数表示如果key重复保留k1,舍弃k2。
		Map<Long, String> map2 = users.stream().collect(Collectors.toMap(User::getId,User::getName,(k1,k2)->k1));
		//key:id value:user
		Map<Long, User> map3 = users.stream().collect(Collectors.toMap(p -> p.getId(), p->p));
		//遍历map,包括k,v。map.values.forEach()不能遍历Key
		map3.forEach((k,v)-> System.out.println("k:v="+k+":"+v));

3. 使用sorted对List排序

//降序,默认是升序
List<User> list=
    users.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());
//遍历list
list.forEach(System.out::println);

Comparator.comparing(User::getId)表示以id作为排序的数据。

4. 对List分组存入一个Map

		//按照性别分组
		Map<String,List<User>> map=users.stream().collect(Collectors.groupingBy(User::getSex));
		map.forEach((k,v)-> System.out.println("k:v="+k+":"+v));

5. 使用map转换大写

List<String> list1 = new ArrayList<>();
		list1.add("a");
		list1.add("b");
		list1.add("c");
		List<String> list2 = list1.stream().map(String::toUpperCase).collect(Collectors.toList());

6. flatMap和map

		//map
		List<String> str = Arrays.asList("a,b,c", "d,e", "f");
		List<String[]> list1 = str.stream().map(s -> s.split(",")).collect(Collectors.toList());
		list1.forEach(p-> System.out.print(Arrays.toString(p)+","));//[a, b, c],[d, e],[f]

		//flatMap
		List<String> list2 = str.stream().map(s -> s.split(",")).flatMap(Arrays::stream).sorted(Comparator.comparing(p->p.toString()).reversed()).collect(Collectors.toList());
System.out.println(list2);//[f, e, d, c, b, a]

flatMap与map的区别在于 flatMap是将一个流中的每个元素都转成一个个流,flatMap之后得到的是每个流中元素的总的集合,即对每个流进行了二次遍历取出其中的元素,融合到总的集合中。

7. reduce

		//求和 sum=11,第一个参数1为初始值(种子),第二个参数为运算规则(BinaryOperator)。1+1+2+3+4=11
		Integer sum = Stream.of(1, 2, 3, 4).reduce(1, Integer::sum);
		//concat="ABCD";
		String concat = Stream.of("A", "B", "C").reduce("", String::concat);
		//求和,reduce方法无初始值,返回类型为Optional,需要调用get()方法取值。
		Integer sum2 = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
		//取最大值,max=2.0。
		Double max = Stream.of(1.0, 2.0, -1.0, 1.5).reduce(Double.MIN_VALUE, Double::max);

optional也是Java 8中的新特性,可以存储null或者实例,有机会再深入讲吧。

8. limit和skip

List<Long> ids=users.stream().map(User::getId).limit(5).skip(2).collect(Collectors.toList());
ids.forEach(System.out::println);//0-9 输出了 2 3 4

limit(5)限制只要前五条,skip(2)跳过前两条。特别注意如果limit和skip配合sorted使用,需先进行limit和skip。

9. anyMatch

		Map<Long, String> map = new HashMap<>();
		map.put(1L, "1号");
		map.put(2L, "2号");
		map.put(3L, "3号");
		List<User> list = Lists.newArrayList();
		list.add(new User(1L,10,"1号","",""));
		list.add(new User(2L,10,"2号","",""));
		list.add(new User(3L,10,"3号","",""));
		boolean f = false;
		//所有都匹配的时候才会返回true
		for(Map.Entry<Long,String> entry:map.entrySet()){
			f = list.stream().anyMatch(p ->
				Objects.equals(entry.getKey(), p.getId())
			);
		}


以下,补充于20191211

突然想起来面试的时候有几个关于取两个List的交集、并集问题也可以用Stream来解决。特此记录一下。

                List<String> list1 = Lists.newArrayList();
		list1.add("1");
		list1.add("2");
		list1.add("3");
		list1.add("4");
		List<String> list2 = Lists.newArrayList();
		list2.add("3");
		list2.add("4");
		list2.add("5");
		list2.add("6");

		//交集,或使用list1.retainAll(list2);
		List<String> intersection=list1.stream().filter(i->list2.contains(i)).collect(Collectors.toList());
		System.out.println("交集:");
		intersection.forEach(System.out::println);
		//差集,或使用list1.removeAll(list2);
		List<String> reduce=list1.stream().filter(i->!list2.contains(i)).collect(Collectors.toList());
		System.out.println("差集:");
		reduce.forEach(System.out::println);
		//并集
		List<String> listAll = list1;
		listAll.addAll(list2);
		System.out.println("并集:");
		listAll.forEach(System.out::println);
		//去重并集,或使用list1.removeAll(list2);list1.addAll(list2);
		List<String> listAllDistinct = listAll.stream().distinct().collect(Collectors.toList());
		System.out.println("去重并集:");
		listAllDistinct.forEach(System.out::println);

使用Stream和使用ArrayList的removeAll、retainAll方法比较,Stream不会改变原来的Listz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值