The*_*ver 20 java lambda java-8 java-stream
我试图根据多个条件筛选列表,排序.
class Student{
private int Age;
private String className;
private String Name;
public Student(int age, String className, String name) {
Age = age;
this.className = className;
Name = name;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个清单,请说
List<Student> students = new ArrayList<>();
students.add(new Student(24, "A", "Smith"));
students.add(new Student(24, "A", "John"));
students.add(new Student(30, "A", "John"));
students.add(new Student(20, "B", "John"));
students.add(new Student(24, "B", "Prince"));
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得具有不同名称的最年长学生的名单?在C#中,通过使用System.Linq GroupBy然后比较然后使用select进行展平,这将非常简单,我不太确定如何在Java中实现相同的功能.
Ous*_* D. 18
使用toMap收藏家:
Collection<Student> values = students.stream()
.collect(toMap(Student::getName,
Function.identity(),
BinaryOperator.maxBy(Comparator.comparingInt(Student::getAge))))
.values();
Run Code Online (Sandbox Code Playgroud)
说明
我们正在使用这个重载toMap:
toMap?(Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
Run Code Online (Sandbox Code Playgroud)
Student::getName上面是keyMapper用于提取地图键值的函数.Function.identity()上面是valueMapper用于提取地图值的值的函数,其中Function.identity()简单地返回源自己的元素即Student对象.BinaryOperator.maxBy(Comparator.comparingInt(Student::getAge))上面是合并函数,用于"决定在关键合并的情况下返回哪个学生对象,即当两个给定的学生具有相同的名称时",在这种情况下取最旧的Student.values()返回给我们一组学生.等效的C#代码是:
var values = students.GroupBy(s => s.Name, v => v,
(a, b) => b.OrderByDescending(e => e.Age).Take(1))
.SelectMany(x => x);
Run Code Online (Sandbox Code Playgroud)
解释(对于那些不熟悉.NET的人)
我们正在使用以下扩展方法GroupBy:
System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TElement,TResult>
(this System.Collections.Generic.IEnumerable<TSource> source,
Func<TSource,TKey> keySelector,
Func<TSource,TElement> elementSelector,
Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult> resultSelector);
Run Code Online (Sandbox Code Playgroud)
s => s.Name以上是keySelector用于将值提取到group by 的函数.v => v上面是elementSelector用于提取值的函数,即Student它们自己的对象.b.OrderByDescending(e => e.Age).Take(1)上面是resultSelector给出一个IEnumerable<Student>代表b最年长的学生..SelectMany(x => x);将结果折叠IEnumerable<IEnumerable<Student>>成一个IEnumerable<Student>.或者没有溪流:
Map<String, Student> map = new HashMap<>();
students.forEach(x -> map.merge(x.getName(), x, (oldV, newV) -> oldV.getAge() > newV.getAge() ? oldV : newV));
Collection<Student> max = map.values();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |