标签: java-stream

将HashMap的键和值组合到Set

我有一个HashMap<Integer, Integer>,唯一键可以有重复的值.有没有办法将HashMap转换为Set<Integer>包含键和值的唯一整数的HashMap .

通过迭代keySet()和.values(),这绝对可以在两个循环中完成.我想知道这是否可以在java 8流中使用.

java java-8 java-stream

2
推荐指数
1
解决办法
3005
查看次数

在流中收集/映射是否只调用一次所有方法?

我有一个对象列表,并希望检索所有对象的最小值和最大值,并重置此值.我的解决方案是在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.但是,由于我没有找到关于此事的确认(甚至在文档中也没有),这个问题.

java java-stream

2
推荐指数
1
解决办法
61
查看次数

Java 8 Stream.skip with Predicate

有没有办法做类似Stream.skip(长)但使用谓词而不是确切的数字?

我需要跳过元素,直到我找到一个具有给定ID的元素,然后我需要继续应用过滤器,限制等任何建议?

java java-stream

2
推荐指数
1
解决办法
2245
查看次数

使用索引迭代IntStream

是否可以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 java-8 java-stream

2
推荐指数
1
解决办法
445
查看次数

java-8 streams:来自中间操作的新流是否在不增加内存的情况下返回?

我试图详细了解java-8流.

从流上的oracle文档页面:

Streams在几个方面与集合不同:

没有存储.流不是存储元素的数据结构; 相反,它通过计算操作管道传递来自诸如数据结构,数组,生成器函数或I/O通道的源的元素.

流操作和管道

流操作分为中间操作和终端操作,并组合成流管道.

流管道由源(例如集合,数组,生成器函数或I/O通道)组成; 然后是零个或多个中间操作,例如Stream.filter或Stream.map; 和一个终端操作,如Stream.forEach或Stream.reduce.

中间操作返回一个新流

除了文档,我还经历了相关的SE问题:

Java中的流如何影响内存消耗?

引用的所有地方都说由于流操作的管道衬里而没有消耗额外的内存.原始流将通过管道传递.

本杰明博客的一个工作实例:

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 java-8 java-stream

2
推荐指数
1
解决办法
718
查看次数

嵌套for循环到Java 8 Stream API表示

最近我决定通过重构简单的代码片段来研究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,所以任何帮助都会非常感激.

java java-8 java-stream

2
推荐指数
1
解决办法
229
查看次数

java stream.peek()如何影响字节码?

据我所知,如果我有一个带有两个过滤器的流,它们将与字节码中的&&结合使用.

例如

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)

这是真的,如果是这样会影响性能(我认为不会).

java performance bytecode java-8 java-stream

2
推荐指数
1
解决办法
161
查看次数

使用flatMap连接列表

我正在阅读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)

有任何想法吗?

java java-8 java-stream

2
推荐指数
1
解决办法
248
查看次数

Java流 - 验证列表中至少有一个元素包含在另一个元素中

我有一张地图.让我们说吧

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)

java java-8 java-stream

2
推荐指数
1
解决办法
4735
查看次数

Java流中的continue关键字的等价物?

  for (final Prices ppr : prices) {
    if (!currency.getCode().equals(ppr.getCurrency().getCode())) {
      continue;
    }
    return ppr.getPrice();
  }
Run Code Online (Sandbox Code Playgroud)

上面的代码可以转换成Java流代码吗?我收到continue关键字错误...

java java-8 java-stream

2
推荐指数
1
解决办法
222
查看次数

标签 统计

java ×10

java-stream ×10

java-8 ×8

bytecode ×1

performance ×1