假设我们有这个流
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
我想在地图中保存几对相邻的字符串,其中第一个以“ err”开头。
我想到的就是这样
Map<String, String> map = new HashMap<>();
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.reduce((acc, next) -> {
if (acc.startsWith("err"))
map.put(acc,next);
if (next.startsWith("err"))
return next;
else
return "";
});
但是我对它并不完全满意,主要有两个原因
reduce
功能。在Stream API中,每个函数都有其明确的定义明确的目的:max
应该计算最大值,filter
应该根据条件进行过滤,reduce
应该产生递增的累加值,依此类推。在这里,我reduce
之所以使用它,是因为(据我所知),它是唯一使您可以比较几个值的函数,以某种方式,它们可以返回类似于“当前值”和“下一个值”的概念。
有没有更直接的方法?是什么让您可以在每次迭代中考虑多个值来迭代流?
我正在考虑的是某种机制,在给定当前元素的情况下,您可以为每次迭代定义要考虑的“元素窗口”。
就像是
<R> Stream<R> mapMoreThanOne(
int elementsBeforeCurrent,
int elementsAfterCurrent,
Function<List<? super T>, ? extends R> mapper);
代替
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
那将是对当前API的强大“升级”。
我感谢人们提出他们的解决方案所付出的努力,但问题本身不是算法。通过将流,索引,临时变量放在一起以存储先前的值来实现我的目标,有多种方法…但是我想知道Stream
API中是否有某种方法专门用于处理当前元素以外的任务而不破坏“流范式”。像这样
List<String> list =
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.filterFunctionImWonderingIfExist(/*filters couples of elements*/)
.limit(2)
.collect(Collectors.toList());
有了答案,我认为除非使用StreamEx库,否则没有“清晰快捷”的解决方案
您可以Collector
为此任务建立自定义。
Map<String, String> map =
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.collect(MappingErrors.collector());
与:
private static final class MappingErrors {
private Map<String, String> map = new HashMap<>();
private String first, second;
public void accept(String str) {
first = second;
second = str;
if (first != null && first.startsWith("err")) {
map.put(first, second);
}
}
public MappingErrors combine(MappingErrors other) {
throw new UnsupportedOperationException("Parallel Stream not supported");
}
public Map<String, String> finish() {
return map;
}
public static Collector<String, ?, Map<String, String>> collector() {
return Collector.of(MappingErrors::new, MappingErrors::accept, MappingErrors::combine, MappingErrors::finish);
}
}
在此收集器中,保留了两个运行元素。每次String
接受a时,它们都会更新,如果第一个以开头"err"
,则会将这两个元素添加到地图中。
另一个解决方案是使用StreamEx库,该库提供一种pairMap
将给定功能应用于此流的每个相邻元素对的方法。在下面的代码中,如果第一个元素以开头"err"
,null
则该操作将返回一个由该对的第一个和第二个元素组成的String数组。null
然后将元素过滤掉,并将Stream收集到地图中。
Map<String, String> map =
StreamEx.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.pairMap((s1, s2) -> s1.startsWith("err") ? new String[] { s1, s2 } : null)
.nonNull()
.toMap(a -> a[0], a -> a[1]);
System.out.println(map);
但我对它并不完全满意,主要有两个原因 我“滥用”了函数。在Stream API中,每个函数都有其明确、明确的用途:被认为是计算最大值,被认为是根据条件进行筛选,被认为是生成增量累加的值,等等。 这样做会阻止我使用Streams强大的机制:如果我想将搜索限制在前两个结果上怎么办? 这里我使用了,因为(据我所知)它是唯一一个允许比较两个值的函数,而这些值可以在某种程度上导致类似于“当前值”和“下一个值
问题内容: 我有一个在HashMap上使用的迭代器,并且保存并加载了该迭代器。有没有办法用迭代器在HashMap中获取上一个密钥?(java.util.Iterator) 更新资料 我将其另存为Red5连接中的属性,然后将其重新加载以在我停止的地方继续工作。 另一个更新 我正在遍历HashMap的键集 问题答案: 正如其他人指出的那样,它并不直接,但是例如,如果您需要访问一个先前的元素,则可以轻松
Go的范围可以在地图和切片上迭代,但我想知道是否有一种方法可以在一系列数字上迭代,比如: 或者有没有一种方法来表示Go中的整数范围,就像Ruby对类范围所做的那样?
问题内容: 我一直在寻找一种操作类似于的方法,但忽略了元素顺序。我在Google Collections(类似,但确实能说明订购)和JUnit(显然只是调用Collection,这取决于Collection的实现,而这并不是我想要的)中都找不到。如果此方法采用s 是最好的,但是我也可以简单地采用s。这样的方法当然会考虑集合中的所有重复元素(因此不能简单地测试)。 请注意,我并不是在问如何实现这样的
问题内容: 有没有办法绕过python中的类的构造函数? 例: 现在,我想创建一个实例。看起来可能像这样,但是这种语法不正确。 编辑: 一个更复杂的示例: 假设我有一个对象,目的是存储一个参数并对其进行一些计算。但是,该参数并未按原样传递,而是被嵌入到巨大的参数文件中。它可能看起来像这样: 现在,我想转储并加载该对象的实例。但是,在加载该对象时,我只有一个变量,并且无法调用构造函数,因为它需要参数
我想删除一些与其他输出值相同的输出!因为Test1=Test2=Test5=Test6,所以我希望它在控制台上只显示Test1!Test3=Test4=Test7=Test8,所以我希望它只显示Test3。。。。。。。。 以下代码是我所做的: 以下是我的输出: