本文完整测试代码见文末。
测试数据是List里的4个员工对象实例:
根据员工所在的城市进行分组:
结果分成了三组:
第一组的员工在上海:
第二组的员工在成都:
统计每组员工个数:
把员工进行分组,得分大于101分的在一组,小于等于101的在另一组:
分组结果:
package java8;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Consumer;
import java.util.stream.Collectors;
class Employee {
private String city;
private String name;
private int score;
public Employee(String name, String city, int score){
this.city = city;
this.name = name;
this.score = score;
}
public String getCity(){
System.out.println("city: " + this.city);
return this.city;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
@Override
public String toString() {
return String.format("Employee: " + this.name + " city: " + this.city);
}
}
class Person {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return String.format("Person{name='%s', age=%d}", name, age);
}
}
// Jerry 2016-01-15 20:51PM ? 多用于extends generic的type,接受所有Object的sub class
public class StreamTest {
private static void printMap(Map<? extends Object, ? extends Object> map) {
for(Entry<? extends Object, ? extends Object> entry:map.entrySet()) {
System.out.println("key = " + entry.getKey() + " , Value = " + entry.getValue());
}
}
public static void main(String[] args) {
ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee("A", "Shanghai",100));
employees.add(new Employee("B", "Chengdu",101));
employees.add(new Employee("C", "Shenzhen",102));
employees.add(new Employee("D", "Chengdu",104));
// group by City
Map<String, List<Employee>> employeesByCity =
employees.stream().collect( Collectors.groupingBy(Employee::getCity));
// default void forEach(Consumer<? super T> action) {
for(Map.Entry<String, List<Employee>> entry:employeesByCity.entrySet()) {
System.out.println("key= " + entry.getKey() + " , Value = " + entry.getValue());
entry.getValue().forEach(System.out::println);
}
// 2016-01-15 20:37PM
Consumer<Employee> aa = a -> { System.out.println("Employee: " + a.getName() + " : " + a.getScore()); };
List<Employee> chengduEmployee = employeesByCity.get("Chengdu");
chengduEmployee.forEach(aa);
// test for counting
Map<String, Long> employeesByCity2 =
employees.stream().collect( Collectors.groupingBy(Employee::getCity, Collectors.counting()));
printMap(employeesByCity2);
// calculate average score
Map<String, Double> employeesByCity3 =
employees.stream().collect( Collectors.groupingBy(Employee::getCity,
Collectors.averagingInt(Employee::getScore)));
printMap(employeesByCity3);
/*Stream<Person> people = Stream.of(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28));
Map<Integer, List<String>> peopleByAge = people.collect(groupingBy(p -> p.age, mapping((Person p) -> p.name, toList())));
System.out.println(peopleByAge);*/
/*
* 分区是一种特殊的分组,结果 map 至少包含两个不同的分组——一个true,一个false。
* 例如,如果想找出最优秀的员工,你可以将所有雇员分为两组,一组销售量大于 N,
* 另一组小于 N,使用 partitioningBy 收集器:
*/
System.out.println("partition result");
Map<Boolean, List<Employee>> partitioned =
employees.stream().collect(Collectors.partitioningBy(e -> e.getScore() > 101));
printMap(partitioned);
/*
* 你也可以将 groupingBy 收集器传递给 partitioningBy 收集器来将联合使用分区和分组。例如,你可以统计每个分区中的每个城市的雇员人数:
Map<Boolean, Map<String, Long>> result =
employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150,
groupingBy(Employee::getCity, counting())));
这样会生成一个二级 Map:
{false={London=1}, true={New York=1, Hong Kong=1, London=1}}
*/
}
}
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
- 创建一个新的List或Map来存储转换后的数据。 - 对于多列数据,可能需要创建一个二维数组或使用ArrayList来存储。 5. 数据库操作: - 如果数据来自数据库,可能需要使用JDBC或其他ORM框架(如Hibernate、...
在这个例子中,`toCamelCaseMap`方法接收一个Map,并使用Java 8的Stream API来创建一个新的Map,其中的Key已经被`underscoreToCamelCase`方法转换为驼峰命名。`underscoreToCamelCase`方法则负责将下划线分隔的字符...
而`collect`操作是Stream API中的一个重要组成部分,它用于将Stream中的元素聚合到一个容器中,如List、Set或Map等。本文将深入讲解`collect`操作及其背后的Collectors工具类,探讨如何利用它们实现更高效的数据处理...
总结来说,Java提供了多种方式来对Map按值进行排序,包括使用TreeMap、Collections.sort、Stream API以及Guava库。选择哪种方法取决于项目需求和个人喜好,但在Java 8及更高版本中,Stream API通常被认为是最简洁和...
例如,假设我们有一个包含多个Person对象的流,每个对象都有名字和年龄属性,我们可以使用`toList`轻松创建一个新的Person对象列表: ```java List<Person> people = Stream.of(new Person("Alice", 25), new ...
例如,`list.stream().filter(x -> x > 10).map(x -> x * 2).collect(Collectors.toList())` 这段代码会过滤出列表中大于10的元素,然后将这些元素乘以2,最后将结果收集到一个新的列表中。 Stream API中的一个重要...
在Java编程语言中,Stream API是Java 8引入的一个强大特性,它提供了处理集合数据的新方式,使得数据处理更加简洁、高效。Stream API允许我们以声明性方式处理数据,非常适合进行聚合操作,如过滤、映射和减少。下面...
Java 8 引入了 Stream API,这是一个革命性的特性,极大地改进了集合处理的方式。Stream API 提供了一种声明性处理数据的方式,使得代码更加简洁、高效。在本文中,我们将深入探讨如何在 Java 8 中构建和使用 Stream...
每个“Java小例子”都是一个独立的学习单元,帮助开发者逐步掌握Java语言的核心概念和实践技巧。如果在运行这些例子时遇到缺少的包,可能需要根据代码内容手动导入相应的Java库,例如`import java.util.*;`用于访问...
为了更好地理解 Stream 的使用方式,我们可以从一个简单的例子入手:从一个水果集合中筛选出苹果,并按照价格降序排列,最后得到一个只包含价格的列表。 ##### 需求描述 假设有一个水果集合,我们需要从中提取出...
在Java编程中,`Collector`接口是Java 8引入的一个重要特性,它是Stream API的核心组成部分,主要用于实现数据的收集操作,比如将Stream转换为集合、计算聚合结果等。`Collector`接口定义了四个核心方法和一个可选...
在这个例子中,我们首先将`listx`转换为一个Map,键是`SkillUpgrade`对象的`lv`属性,值是`SkillUpgrade`对象本身。然后,我们遍历`lists`,如果找到相同的`lv`值,就将`listx`中的相应对象的`selectNum`值复制到`...
如果我们创建一个HashMap, String>,并想要获取按年龄升序排列的键值对,我们可以使用Java 8的Stream API: ```java Map, String> map = new HashMap(); // 添加元素... List<Map.Entry, String>> sortedEntries =...
在本案例中,我们将深入探讨如何利用Java 8的流API来抽取对象属性,具体通过一个例子来分析。 题目中的代码片段展示了如何从`field`集合中抽取满足特定条件的对象属性,并将其转换成`List<String>`。首先,我们看到...
4. **映射操作**:`map()`方法可以使用Lambda将列表中的每个元素转换为新类型,如`list.stream().map(String::length).collect(Collectors.toList())`获取字符串列表的长度列表。 5. **并行流**:Lambda可以与并行...
例如,我们可能有一个`List,Integer>>`,其中每个函数都能将字符串转换为整数。 5. **流(Stream)与函数操作** Java 8的Stream API支持函数式编程,我们可以对函数数组进行操作,如映射、过滤和归约。例如,我们...
77.JSON处理:示例可能涵盖使用Gson或Jackson库将Java对象转换为JSON字符串,以及反序列化回Java对象。 78.XML处理:DOM、SAX和StaX API可用于解析和生成XML文档,示例可能涵盖这些API的使用。 79.图形绘制:Java...
Java 类集(Collections)是Java编程语言中一个重要的组成部分,它包含了各种数据结构,如列表、集合、映射等,以及对这些数据结构进行操作的工具类。在本压缩包中,你将找到一系列关于Java类集应用的源码实例,这些...
"说明.txt"可能是对每个例子的简短描述,而"使用说明.url"可能指向一个网页,提供了更详细的解释或使用指南。通过这些实例,初学者或有经验的开发者都能深化对Java的理解,并提升自己的编程能力。
Java Lambda 和 Stream API 是 Java 8 引入的两个重要特性,它们极大地简化了代码,提高了编程效率。Lambda 表达式是函数式编程的核心概念,而 Stream API 则为处理大量数据提供了一种高效、易读的方式。下面将详细...