使用Java8 sterams在数字列表中查找数字

时间:2016-11-30 06:21:13

标签: java-8

我有一个数字列表

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

我试图确定输入int Integer minutes;是否在上面数组的任何两个成员之间。

输入Integer minutes = 23;

示例我希望 20 作为答案。

有关如何在迭代 tensOfMinutes 流时实现此目的的任何想法?

3 个答案:

答案 0 :(得分: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方法用于确保其安全性。

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

你需要第一个较大数字之前的数字,所以试试这个:

int previous=0
for(Integer number : tensOfMinutes)
    if(number<=numberToFind)
        previous=number;

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