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

Igo*_*gor 4 java-8

我有一个数字列表

List<Integer> tensOfMinutes = Arrays.asList(10, 20, 30, 40, 50, 60);
Run Code Online (Sandbox Code Playgroud)

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

示例:对于输入,Integer minutes = 23;我希望得到20作为答案.

有关如何在迭代tensOfMinutes流时完成此任务的任何想法?

Вит*_*вич 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 ) );
Run Code Online (Sandbox Code Playgroud)

您筛选出大于的所有元素,23然后打印剩余元素中的最后一个元素.

使用dropWhileJava 9,Scala和Haskell中的函数会更容易:

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);
Run Code Online (Sandbox Code Playgroud)

您可以看到(a,b) -> blambda用于表示最后一个元素以及ifPresent用于使其安全的方法.

  • `l.stream().filter(i - > i <23).reduce((a,b) - > b).ifPresent(System.out :: println);`或者如果元素没有预先排序使用`.reduce(Math :: max)`而不是`.reduce((a,b) - > b)`...顺便说一句,我看不出`dropWhile`会如何让事情变得更容易. (3认同)