使用Java8流查找数字列表中的数字

4

我有一个数字列表

List<Integer> tensOfMinutes = Arrays.asList(10, 20, 30, 40, 50, 60);

我正在尝试确定输入的整数 Integer minutes; 是否在数组中的任意两个成员之间。

示例: 对于输入的 Integer minutes = 23;,我期望得到答案 20

在遍历 tensOfMinutes 流时,有什么想法可以实现这一点吗?


输入是否保证已经排序? - Tunaki
3个回答

5
你可以这样做:
List<Integer> l = Arrays.asList(10, 20, 30, 40, 50, 60)
        .stream()
        .filter( (i) -> i<23 )
        .collect(Collectors.toList());
System.out.println( l.get( l.size() - 1 ) );

您需要过滤掉所有大于 23 的元素并打印剩余元素中的最后一个。如果使用 Java 9、Scala 和 Haskell 中提供的 dropWhile 函数,将更加简单。请参见:https://docs.oracle.com/javase/9/docs/api/java/util/stream/Stream.html#dropWhile-java.util.function.Predicate-

Holger 的改进版本

    Stream<Integer> stream = Arrays.asList(10, 20, 30, 40, 50, 60).stream();
    stream.filter( i -> i<23 )
      .reduce( (a,b) -> b )
      .ifPresent(System.out::println);

你可以看到 (a,b) -> b lambda 表达式被用来获取最后一个元素,ifPresent 方法被用来确保它不会出错。

3
l.stream().filter(i -> i<23).reduce((a,b) -> b).ifPresent(System.out::println); 如果元素没有预先排序,请使用 .reduce(Math::max) 替代 .reduce((a,b) -> b)... 顺便说一句,我不明白 dropWhile 如何使任何事情变得更容易。 - Holger
@Holger 使用reduce的好方法。 - Igor

0

列表 list = IntStream.of(10, 20, 6, 7, 81).boxed().collect(Collectors.toList());


这个问题已经有多个答案和一个被接受的答案了。您能否通过编辑您的答案来解释您的答案与其他答案的区别?同时请注意,仅有代码的答案从长远来看是没有用处的。 - 7uc1f3r

-2
你需要第一个更大数字之前的数字,请尝试这个:
int previous=0
for(Integer number : tensOfMinutes)
    if(number<=numberToFind)
        previous=number;

您需要循环遍历所有数字,并记住最后一个小于或等于您在变量previous中搜索的数字。这需要列表按升序排序。我不知道整数类的确切规格,但这是一种方法。


4
问题在标题和正文中都明确提到了使用流。 - Evan Trimboli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接