使用java流从集合中获取两个min对象

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应该很快,因为在我的真实程序中,我多次调用此方法,我的集合非常大.

Ous*_* D. 4

您可以获得第二个最小值,如下所示:

 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应该很快,因为在我的真实程序中,我多次调用此方法,我的集合非常大.

至于需要一个"快速"程序,我建议你首先尝试使用典型的命令式方法来解决手头的问题,因为在大多数情况下它们比使用流更快.

如果它不是更好,那么"考虑"使用并行流,当且仅当您知道可以利用并行性时.

我应该尽可能使用并行流吗?

  • @zakzak嗯人们学习的方式不同,我当然有一系列Java流书籍,例如"Java-8 in action","核心java for the greatient"等等.你也可以在网上找到很多教程以及很多youtube视频已经在那里,你应该尝试一下.但最重要的部分是**练习**,**练习**和**练习**,这个网站在这方面肯定帮了我很多(通过回答问题). (2认同)