我不断遇到需要通过映射或集合保存状态的解决方案。e、 g.创建一个返回在输入中找到的重复项的方法
// non streams solution
public int[] getDuplicates(int[] input){
Set<Integer> allSet = new HashSet<Integer>();
Set<Integer> duplicates = new HashSet<Integer>();
int[] dups = new int[input.length];
int j = 0;
for (Integer i : input) {
if (!allSet.add(i)) {
if(duplicates.add(i)) {
dups[j++] = i;
}
}
}
return Arrays.copyOfRange(dups, 0, j);
}
我的Java8流解决方案,不幸的是,我正在使用哈希集进行过滤。我理解这并不“恰当”,因为这取决于州。没有州是建议还是硬性规定?这只是运行并行流时的问题吗?有人能推荐一种不使用哈希集的方法吗?
public static int[] getDuplicatesStreamsToArray(int[] input) {
Set<Integer> allSet = new HashSet<>();
int[] dups = Arrays.stream(input)
.sequential() // prevents parallel processing
.unordered() // speed up distinct operation
.boxed() // int to Integer
.filter(n -> !allSet.add(n)) // passes dups, but uses STATE
.distinct() // uses internal Set of dups
.mapToInt(i -> i) // Integer back to int
.toArray();
return dups;
}
这个怎么样
基本上,创建 Map 类型的频率计数
public static int[] getDuplicatesStreamsToArray(int[] input) {
int[] dups = Arrays.stream(input).boxed().collect(
Collectors.groupingBy(Function.identity(),
Collectors.counting())).entrySet().stream().filter(
e -> e.getValue() > 1).mapToInt(
e -> e.getKey()).toArray();
return dups;
}
我误解了你之前想做的事。
此问题是之前问题的后续:使用Streams添加BigDecimals 这个问题与使用Java8和Lambda表达式添加有关。在实现给出的答案后,我遇到了另一个问题:每当流为空时,方法都会抛出一个。 考虑下面的代码: 香草Java代码对空集合没有问题,但是新的Java8代码有问题。 在这里避免NSEE最优雅的方式是什么?当然,我们可以做到: 但是有没有一种Java的方法来处理空集合?
如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(
如何过滤<代码>地图 仅当列表中的任何员工具有字段值性别=“M”时,我才必须过滤。 输入:
我想编写一个存储过程来将数据插入到表中,并检查是否已经存在相同的数据? 如果是,则异常抛出为已经存在。但我不知道应该在哪里添加异常。请帮忙。
钱箱类: 商户类: 输入数据: 我的任务 计算每个商家的总金额并返回商家列表 我正在尝试使用Stream API解决这个任务。并编写了以下代码: 结果 但显然,流返回四个对象,而不是所需的两个对象。我意识到,地图(第二行)为每个cashBoxId创建了四个对象。而且我不知道如何通过进行过滤,也不知道如何获得没有重复的结果。
我们使用了一个非常简单的流程,从PubSub检索消息,将其JSON内容扁平化为两种类型(对于BigQuery和Postgres),然后插入到两个接收器中。但是,我们在两个接收器中都看到了重复的情况(Postgres有点固定了,有一个唯一的约束和一个“关于冲突……什么都不做”)。 起初,我们信任Apache Beam/BigQuery创建的所谓“插入式”UUId。然后,在将消息排入PubSub之前,