JAVA1.8--Stream流 收集(十一)

/**
 * 收集
 *         
 *             方法                                描述
 *     collect(Collector c)       将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法 
 *  
 *  Collectors
 * 
 *  Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。但是Collectors实用类
 *  提供了很多静态方法,可以方便的创建常见收集器实例,如下表:
 *  
 *    方法                返回类型                       作用                                     示例
 *    tolist                    List               把流中元素收集到List              List list=list.stream().collect(Collectors .toList());
 *    toSet                   Set               把流中元素收集到Set               Set  set=list.stream() .collect(Collectors.toSet());
 *  toCollection      Collection     把流中元素收集到创建的集合   Collection maps=list.stream().collect(Collectors
 *                                                                                                       .toCollection(ArrayList::new));
 *  counting               Long            计算流中元素的个数                long count=list.stream().collect(Collectors.counting());
 *  summingInt        Integer        对流中元素的整数属性求和        Integer sum=persons.stream().collect(Collectors
 *                                                                                                       .summingInt(Person::getAge));
 *  averagingInt    Double       计算流中元素Integer属性的平均值 double avg=list.stream().collect(Collectors
 *                                                                                                        .averagingInt(Person::getAge));
 *  summarizingInt   IntSummary-        收集流中Integer属性        IntSummaryStatistics iss= list.stream()
 *                              -Statistics            的统计值.如:平均值                .collect(Collectors.summarizingInt(Person::getAge));
 *     joining            String            连接流中每个字符串                  String str=list.stream() .map(Person::getName)
 *                                                                                                           .collect(Collectors.joining());
 *  maxBy            Optional<T>        根据比较器选择最大值           Optional max=list.stream().collect(Collectors
 *                                                                                                           .maxBy(comparingInt(Person:getAge)));
 *  minBy            Optional<T>        根据比较器选择最小值            Optional min=list.stream().collect(Collectors
 *                                                                                                           .minBy(comparingInt(Person:getAge)));
 *  reducing        规约产生的类型     从一个作为累加器的初始值开始,    int total=list.stream().collect(Collectors
 *                                                      利用BinaryOperator与流中                    .reducing(0,Person::getAge,Integer::sum))
 *                                                 元素逐个结合,从而规约成单个值            
 *  collecting-        转换函数返回的类型    包裹另一个收集器,对其结果   int how=list.stream().collect(Collectors
 *  -AndThen                                                  转化函数                                   .collectingAndThen(Collectors.toList(),List::size))       *  groupingBy      Map<K,List<T>>    根据某属性值对流分组,属性为K,    Map<Person.Sex,List<Person>> 
 *                                                                    结果为V                                      map=persons.stream().collect(Collectors
 *                                                                                                                       .groupingBy(Person:;getGender))
 *  partitioningBy   Map<Boolean,List<T>>    根据true或false进行分区        Map<Boolean,List<Person>>
 *                                                                                                                       map=persons.stream().collect(Collectors
 * 
 * */

public class StramCollectInfo {
	//生成多个Person对象
	List<Person> persons = Person.createRoster();
	
	@Test
	public void test(){
		List<String> list = persons.stream()
				.map(Person::getName)
				.collect(Collectors.toList());
		list.forEach(System.out::println);
	}
	@Test
	public void test1(){
		Optional<Integer> max = persons.stream()
				.map(Person::getAge)
				.collect(Collectors.maxBy(Integer::compare));
		
		System.out.println("最大年龄:"+max.get());
		
		
		Optional<Person> op = persons.stream()
				.min(Comparator.comparingInt(Person::getAge));
		
		System.out.println("最小年龄的成员:"+op.get());
		
		Integer sum = persons.stream()
				.collect(Collectors.summingInt(Person::getAge));
		
		System.out.println("所有成员的年龄总和:"+sum);
		
		IntSummaryStatistics iss=persons.stream()
				.collect(Collectors.summarizingInt(Person::getAge));
		
		System.out.println("最大年龄:"+iss.getMax());
		
	}
	//分组
	/**
	 * {
	 *	MALE=[Person [name=Fred, birthday=1980-06-20, gender=MALE, emailAddress=fred@example.com], 
	 *		  Person [name=George, birthday=1983-08-13, gender=MALE, emailAddress=george@example.com], 
	 *		  Person [name=Bob, birthday=2000-09-12, gender=MALE, emailAddress=bob@example.com]], 
	 *	FEMALE=[Person [name=Jane, birthday=1990-07-15, gender=FEMALE, emailAddress=jane@example.com]]
	 *	}
	 * 
	 * */
	@Test
	public void test2(){
		Map<Person.Sex, List<Person>> map = persons.stream()
				.collect(Collectors.groupingBy(Person::getGender));
		
		System.out.println("按性别分组:"+map);
	}
	//多级分组
	/**
	 * {
	 *	FEMALE={青年=[Person [name=Jane, birthday=1990-07-15, gender=FEMALE, emailAddress=jane@example.com]]}, 
	 *	MALE={青年=[Person [name=Bob, birthday=2000-09-12, gender=MALE, emailAddress=bob@example.com]], 
	 *		  中年=[Person [name=Fred, birthday=1980-06-20, gender=MALE, emailAddress=fred@example.com], 
	 *		  Person [name=George, birthday=1983-08-13, gender=MALE, emailAddress=george@example.com]]}
	 *	}
	 * */
	@Test
	public void test3(){
		
		Map<Person.Sex, Map<String,List<Person>>> map = persons.stream()
				.collect(Collectors.groupingBy(Person::getGender
						,Collectors.groupingBy(p -> {
					if(p.getAge()>=60){
						return "老年";
					}else if(p.getAge()>=35){
						return "中年";
					}else{
						return "青年";
					}
				})));
		
		System.out.println(map);
		
	}
	
	//分区
	/**
	 * {
	 * false=[Person [name=Fred, birthday=1980-06-20, gender=MALE, emailAddress=fred@example.com], 
	 *		   Person [name=Jane, birthday=1990-07-15, gender=FEMALE, emailAddress=jane@example.com], 
	 *		   Person [name=George, birthday=1983-08-13, gender=MALE, emailAddress=george@example.com], 
	 *		   Person [name=Bob, birthday=2000-09-12, gender=MALE, emailAddress=bob@example.com]], 
	 * true=[]
	 * }
	 * */
	@Test
	public void test4(){
		
		Map<Boolean, List<Person>> map = persons.stream()
				.collect(Collectors.partitioningBy(e -> e.getAge()>=50));
		
		System.out.println(map);
		
	}
	
	//流中元素间添加分隔符并在前后添加标识
	/**
	 * 运行结果:
	 * ----Fred,Jane,George,Bob----
	 * */
	@Test
	public void test5(){
		
		String str = persons.stream()
				.map(Person::getName)
				.collect(Collectors.joining(",","----","----"));
		System.out.println(str);
		
	}
	
	
	//规约
	@Test
	public void test6(){
		
		Optional<Integer> sum = persons.stream()
				.map(Person::getAge)
				.collect(Collectors.reducing(Integer::sum));
		
		System.out.println(sum.get());
		
	}
}

源码下载地址:https://download.csdn.net/download/qq_20410965/12434193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 1.8Java 15是Java编程语言的不同版本。Java 1.8,也被称为Java 8,是Java平台的第8个主要版本,它于2014年发布。Java 15,也被称为Java SE 15,是Java平台的第15个主要版本,它于2020年发布。 Java 1.8引入了许多重要的特性和改进。其中最显著的是Lambda表达式和函数式编程的支持,这使得编写简洁、高效的代码变得更加容易。它还引入了Stream API,这是一种用于处理集合数据的强大工具,可以实现并行处理和提高性能。此外,Java 1.8还引入了新的日期和时间API,提供了更好的日期和时间处理功能。 Java 15作为后续版本,引入了许多新特性和改进。其中之一是Sealed类,它可以限制其他类对其进行扩展,从而增加了代码的可维护性和安全性。Java 15还引入了Pattern Matching,这是一种增强的instanceof操作符,可以用更简洁的方式进行类型匹配和转换。此外,Java 15还改进了G1垃圾收集器和ZGC垃圾收集器,提高了性能和吞吐量。 总的来说,Java 1.8Java 15都是Java平台的重要版本,它们各自引入了许多新特性和改进,为Java开发者提供了更多的选择和能力。使用Java 1.8可以享受Lambda表达式、Stream API和新的日期和时间API的优势,而使用Java 15则可以受益于Sealed类、Pattern Matching和改进的垃圾收集器等新功能。根据项目需求和个人喜好,开发者可以选择适合自己的版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值