[英]Remove max (or min) from collection using Java8 streaming API
我对使用Java 8中的新流API的代码设计没有什么问题。我想学习新的东西,其中一个任务是:
从列表中拒绝最大值和最小值。 列表不包含重复项。
看起来很简单 不...我的代码:
List<Integer> ranges = Lists.newArrayList(new Range(1, 15));
List<Integer> collect = ranges.stream()
.filter(x -> x != ranges.stream()
.mapToInt(Integer::intValue)
.max()
.getAsInt())
.filter(x -> x != ranges.stream()
.mapToInt(Integer::intValue)
.min()
.getAsInt())
.collect(Collectors.toList());
assertThat(collect).hasSize(13); // OK
assertThat(collect).isEqualTo(Lists.newArrayList(new Range(2,14))); // OK
这段代码很好(如果我们没有最小/最大的重复,但这不是一个核心问题)但问题是我在这里使用三个流。 首先是主流,第二个是删除最大值,第三个是删除最小值。 是否有可能在一个流中执行此任务?
//编辑:非常原始的Scala版本:
val list = List.range(1, 15).sortWith(_>_).tail.reverse.tail
另外一种,因为我们可以有shuiffeled列表。
别忘了Collection.removeIf
。 你可以计算最小值和最大值,然后执行:
list.removeIf(x -> x == min || x == max);
(这也很重复。)
解决方案效率不高,但我认为它符合您的要求 - 它可以满足您的需求,并且只需一个管道 - 一个批量数据操作序列,Java 8如何调用它。
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Stream<Integer> ranges = Stream.iterate(1, i -> i + 1).limit(15);
List<Integer> collect = ranges
.sorted(Comparator.reverseOrder()) // sort the stream from the highest to the smallest
.skip(1) // discards 1 element from the beginning
.sorted() // sort the stream from the smallest to the highest
.skip(1) // discards 1 element from the beginning
.collect(Collectors.toList())
;
但是,正如fge所建议的那样,Marco13在你的问题下面的评论中写道,将流排序,终止管道到列表然后删除第一个和最后一个成员会更好更有效:P甚至更快没有排序 - 浏览所有元素,找到最小值和最大值,记住它们的位置,然后将它们删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.