zak*_*zak 8 java lambda set java-8 java-stream
我有一些对象.我需要从Set中获取两个min对象.
我的例子如下:
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Example {
public static void main( String[] args ) {
SomeObject obj1 = new SomeObject(1);
SomeObject obj2 = new SomeObject(2);
SomeObject obj3 = new SomeObject(3);
Set<SomeObject> set = Stream.of(obj1,obj2,obj3)
.collect(Collectors.toSet());
SomeObject minObject= set.stream()
.min(Comparator.comparingInt(object->object.getValue()))
.get();
System.out.println(minObject);
}
}
class SomeObject{
private int value;
SomeObject(int value){
this.value=value;
}
public int getValue() {
return value;
}
@Override
public String toString() {
return this.value+"";
}
}
Run Code Online (Sandbox Code Playgroud)
在我的例子中,我可以根据value属性从这个Set中获取min对象.
所以,我需要使用java流操作获取两个最小值.
awnser应该很快,因为在我的真实程序中,我多次调用此方法,我的集合非常大.
您可以获得第二个最小值,如下所示:
set.stream()
.filter(s -> s.getValue() != minObject.getValue())
.min(Comparator.comparingInt(object -> object.getValue()))
.get();
Run Code Online (Sandbox Code Playgroud)
filter.min或者你可以同时得到两个:
Stream<SomeObject> twoMinValues = set.stream()
.sorted(Comparator.comparingInt(object -> object.getValue()))
.limit(2);
Run Code Online (Sandbox Code Playgroud)
awnser应该很快,因为在我的真实程序中,我多次调用此方法,我的集合非常大.
至于需要一个"快速"程序,我建议你首先尝试使用典型的命令式方法来解决手头的问题,因为在大多数情况下它们比使用流更快.
如果它不是更好,那么"考虑"使用并行流,当且仅当您知道可以利用并行性时.