我有一个HashMap<Integer, Integer>,唯一键可以有重复的值.有没有办法将HashMap转换为Set<Integer>包含键和值的唯一整数的HashMap .
通过迭代keySet()和.values(),这绝对可以在两个循环中完成.我想知道这是否可以在java 8流中使用.
我有一个对象列表,并希望检索所有对象的最小值和最大值,并重置此值.我的解决方案是在Object类中有一个方法,它返回值并重置它和Min-Max收集器.因此我的问题是:collect/ 每个实例都map调用每个方法(在这种情况下是getAndResetValue()方法),或者下面的内容是否会被破坏?
MinMax minMax = objects.stream()
.mapToInt(e -> e.getAndResetValue())
.collect(() -> new minMax(startValues), MinMax::addValue, MinMax::compareMinMax);
Run Code Online (Sandbox Code Playgroud)
我的有根据的猜测是,这是真的,因为不需要多次调用这些方法,并且必须映射每个Object.但是,由于我没有找到关于此事的确认(甚至在文档中也没有),这个问题.
有没有办法做类似Stream.skip(长)但使用谓词而不是确切的数字?
我需要跳过元素,直到我找到一个具有给定ID的元素,然后我需要继续应用过滤器,限制等任何建议?
是否可以IntStream使用索引迭代int数组?
试着这样做:
ByteBuf buf = ...;
int[] anArray = ...;
IntStream.of(anArray).forEach(...); // get index so I can do "anArray[index] = buf.x"
Run Code Online (Sandbox Code Playgroud) 我试图详细了解java-8流.
从流上的oracle文档页面:
Streams在几个方面与集合不同:
没有存储.流不是存储元素的数据结构; 相反,它通过计算操作管道传递来自诸如数据结构,数组,生成器函数或I/O通道的源的元素.
流操作和管道
流操作分为中间操作和终端操作,并组合成流管道.
流管道由源(例如集合,数组,生成器函数或I/O通道)组成; 然后是零个或多个中间操作,例如Stream.filter或Stream.map; 和一个终端操作,如Stream.forEach或Stream.reduce.
中间操作返回一个新流
除了文档,我还经历了相关的SE问题:
引用的所有地方都说由于流操作的管道衬里而没有消耗额外的内存.原始流将通过管道传递.
本杰明博客的一个工作实例:
List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
但是当中间操作像filter, map and sorted 返回新流时,怎么会不增加内存消耗?我在这里错过了什么吗?
最近我决定通过重构简单的代码片段来研究Java 8.我有以下示例,我试图转换为Java 8表示.
public static void halfTriangle(){
for(int i=1; i<=4; i++){
for(int j=1; j<=i; j++){
System.out.print("* ");
}
System.out.println(" ");
}
}
Run Code Online (Sandbox Code Playgroud)
我设法想出这样的东西:
public static void halfTriangleJava8(){
IntStream.range(1, 5)
.forEach(i -> IntStream.range(1, 5)
.forEach(j -> System.out.println("* "))
);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道我可以留在哪里:
System.out.println(" ");
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西:
public static void halfTriangleJava8(){
IntStream.range(1, 5)
.forEach(i -> {
IntStream.range(1, 5);
System.out.println(" ");
}
.forEach(j -> System.out.println("* "))
);
}
Run Code Online (Sandbox Code Playgroud)
但它给了我一个我不完全理解的错误."此表达式的目标类型必须是功能接口".
我相信这是一个非常简单的错误,但我今天才开始研究Java 8,所以任何帮助都会非常感激.
据我所知,如果我有一个带有两个过滤器的流,它们将与字节码中的&&结合使用.
例如
IntStream.range(1,10)
.filter(i -> i % 2 == 0)
.filter(i -> i % 3 == 0)
.sum();
Run Code Online (Sandbox Code Playgroud)
会像i%2 == 0 && i%3 == 0.
偷看会影响这个吗?
如果你在第一个文件管理器后偷看你得到2468,如果你偷看第二个,你只得到6(当然).
但如果你偷看这两个地方
IntStream.range(1,10)
.filter(integer -> integer % 2 == 0)
.peek(i-> System.out.print(i))
.filter(integer -> integer % 3 == 0)
.peek(i-> System.out.print(i))
.sum();
Run Code Online (Sandbox Code Playgroud)
你得到24668.
我的假设是,这必然意味着操作在某种程度上是由于窥视调用而分开的.就像是
if(i%2==0)
peek
if(i%3==0)
Run Code Online (Sandbox Code Playgroud)
这是真的,如果是这样会影响性能(我认为不会).
我正在阅读Ricahrd Warburton的Java 8书,他提供了以下练习:
尝试使用方法引用重写以下内容:
[...]
用于连接列表的flatMap方法
我真的不明白如何在flatMap这里申请.令我感到困惑的是,平面地图用于将a的每个元素映射Stream到另一个Stream,然后将它们连接在一起以产生更大的Stream但是在这里我们必须分开List<T>.
public static <T> List<T> concat(List<T> lst1, List<T> lst2){
//lst1.stream().flatMap() - it maps each elements
//of lst1 to stream and concatenates it for each
//element
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一张地图.让我们说吧
Map<Long, Train>
Run Code Online (Sandbox Code Playgroud)
每列火车都有一份清单
List<Integer> parts = train.getTrainParts()
Run Code Online (Sandbox Code Playgroud)
我有另一个清单
List<Integer> blueParts;
Run Code Online (Sandbox Code Playgroud)
我想迭代地图并收集所有至少有一个蓝色部分的列车.
这是Streams 的天真用法:
trainMap().values().stream().filter(part -> {
boolean found = false;
for (Long part : train.getTrainParts()) {
if (blueParts.conatins(part)) {
found = true;
}
}
return found;
).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
有什么更好的选择?流还是不流?
例如
tagDataContainer.getDeliveryGroupMap().values().stream().filter(dg -> {
Sets.SetView<Long> intersection = Sets.intersection(Sets.newHashSet(dg.getPlacements()), Sets.newHashSet(placementsToChangeStatusToPublish));
return intersection.size()>0;
}
);
Run Code Online (Sandbox Code Playgroud) for (final Prices ppr : prices) {
if (!currency.getCode().equals(ppr.getCurrency().getCode())) {
continue;
}
return ppr.getPrice();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以转换成Java流代码吗?我收到continue关键字错误...