标签: java-stream

与Stream.of()的Java 8错误 - 像流和连接它们?

为什么以下java 8代码在第二次调用get()时显示错误?

    Stream<String> aStream = Stream.concat(Stream.of("A"), Stream.of("B"));
    String a = stream.findFirst().get();
    String b = stream.findFirst().get();
Run Code Online (Sandbox Code Playgroud)

"aStream"流应该看到两个值:"A"和"B".但是,在第一个元素已被消耗之后尝试读取任何内容

    java.lang.IllegalStateException: stream has already been operated upon or closed
Run Code Online (Sandbox Code Playgroud)

这不是Java 8中的错误吗?首先,为什么不消耗的Stream.of()-created流返回Optional与isPresent()==false?第二,为什么不Stream.concatenate()正确连接这样的Stream.of()创建流?

java concatenation illegalstateexception java-stream

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

如何使用Java-8将对象转换为地图

考虑以下对象:

class Interval {
   final String name;
   final Date start;
   final Date end;
   final int intervalId;
}
Run Code Online (Sandbox Code Playgroud)

我收到了一份间隔清单.我需要检查它等于给定的地图.例如:

boolean checkEqual(List<Interval> intervals, Map<Date, Date> startEnd) {


}
Run Code Online (Sandbox Code Playgroud)
  1. 我想使用Java8将间隔列表转换为开始/结束日期的映射,然后与startEndMap进行比较

即

boolean checkEqual(List<Interval> intervals, Map<Date, Date> startEnd) {
       Map<Date, Date> map = intervals.streams.filter ?? is there a way to do it ?
       return map.equals(startEnd)
}
Run Code Online (Sandbox Code Playgroud)

怎么做 ?

  1. 有没有更好的办法 ?

java-8 java-stream

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

在收集流结果时获取意外的NullPointerException

从流中收集数据时,我遇到了一个令人讨厌的NullPointerException。在我看来,我不应该得到一个,这就是困扰我的地方。

这是错误的代码:

descriptiveData
    .stream()
    .map(Signaletiques::getContrats)
    .filter(Objects::nonNull)
    .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

descriptiveData不为null,并且不包含任何null对象,但是getContrats的结果可能是。这是一个非常有效的商业情况,我认为使用过滤器来处理它是解决问题的方法,但我所能得到的只是这个异常:

原因:java.util.stream.ReferencePipeline $ 3 $ 1.accept(ReferencePipeline.java:193)处的java.lang.NullPointerException java.util.stream处的java.util.ArrayList $ ArrayListSpliterator.tryAdvance(ArrayList.java:1351) .ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)at java.util。 java.util.stream.FindOps $ FindOp.evaluateSequential(FindOps.java:152)的java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)的stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) .util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)位于be.formatech.forhrm.appipay.synchrosignaletique.service.impl。SynchronisationAppipayUcmIdFetcherImpl.searchWorkerIdThroughContractsData(SynchronisationAppipayUcmIdFetcherImpl.java:141)`

知道这可能来自什么吗?

编辑:

我真的很抱歉 !

我在descriptiveData列表中确实有一个空值,但是IntelliJ并未显示它: 在此处输入图片说明

感谢@Nikolas提供的答案确实正确。

java nullpointerexception java-8 java-stream

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

未知的源Java 10

我在运行以下代码时遇到错误:

public class TestClass {

public static void main(String[] args) {
    var list = new ArrayList<String>();
    list.add("Harry");
    list.add("Marry");
    list.add(null);
    list.add("Larry");

    list.removeIf(e -> e.startsWith("H"));
    list.forEach(System.out::println);

    }
}
Run Code Online (Sandbox Code Playgroud)

获得以下错误:

Exception in thread "main" java.lang.NullPointerException
at test/test.TestClass.lambda$0(TestClass.java:14)
at java.base/java.util.ArrayList.removeIf(Unknown Source)
at java.base/java.util.ArrayList.removeIf(Unknown Source)
at test/test.TestClass.main(TestClass.java:14)
Run Code Online (Sandbox Code Playgroud)

为什么我得到了未知的源错误,如果我提供以下lambda它会正常工作:

list.removeIf(e -> e == null);
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

Java:使用Stream API在嵌套列表中查找公共项

比方说我有一个List<List<Animal>> animals.此嵌套列表表示每个地方包含动物列表的地点列表.

我需要找出至少出现在两个不同地方的动物类型列表.我知道我可以做正常的循环并做到这一点.有什么办法可以通过Stream API完成吗?

例:

List<List<Animal>> animals = new ArrayList<>();
animals.add(Arrays.asList(new Dog(), new Cat()));
animals.add(Arrays.asList(new Dog(), new Bird()));
animals.add(Arrays.asList(new Bird()));
Run Code Online (Sandbox Code Playgroud)

预期(相当于):

List<Class<? extends Animal>> animalTypes = Arrays.asList(Dog.class, Bird.class);
Run Code Online (Sandbox Code Playgroud)

至于尝试,我只设法将内部列表转换为一组类:

animals.stream().map(place -> place.stream().map(animal -> animal.getClass()).collect(Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)

更新

没有Stream API的代码:

final List<List<Animal>> animals = new ArrayList<>();
animals.add(Arrays.asList(new Dog(), new Cat()));
animals.add(Arrays.asList(new Dog(), new Bird()));
animals.add(Arrays.asList(new Bird()));

final Map<Class<? extends Animal>, Integer> count = new HashMap<>();

for (final List<Animal> place : animals) {
    final Set<Class<? extends Animal>> uniqueTypes = new HashSet<>();

    for …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

Java 8 Streams.将两个参数传递给forEach中调用的方法

使用Java 8流API,我想要一种方法来调用一个接受两个参数的引用方法.splitFileByMaxRows是一个应该采用a String和a int作为参数的引用方法.有没有办法实现它?

private void breakLargeFileIntoChunks(final File setlFile, int parentFileId) {
    LOG.info(LOG.isInfoEnabled() ? "*** Breaking Large File Into Chunks ***" : null);

    try (Chunker chunker = new Chunker(); 
         Stream<String> lines = Files.lines(Paths.get(setlFile.getAbsolutePath()))) {
        lines.forEach(chunker::splitFileByMaxRows);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

使用stream api修改传递的参数

我有关于范围,流和重新分配的问题.

我想知道是否有办法使用流式api执行此操作而无需重新分配列表.重新分配参数的问题是它打破了范围,因此测试没有看到新值.

我知道还有其他方法(迭代器,向后迭代等)来解决问题.这个问题只是出于好奇.

测试代码:

@Test
void testAllNegativesByIterator() {
    List<Integer> values = new ArrayList<>(Arrays.asList(-1, -2, -3, -4, -5, -6, -7, -8, -9));
    p.removeNegativesByIterator(values);
    checkNonNegativeSize(0, values);
}
Run Code Online (Sandbox Code Playgroud)

被测代码:

public void removeNegativesByStream(List<Integer> values) {
    values = values.stream().filter(v -> v > 0).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我也明白我可以返回一个值.正如我在问题中所说的那样,我特意要求一种方法来利用好奇心来实现这一点.

java java-stream

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

有没有办法将此for循环转换为使用Java流?

Set<String> unique = new HashSet<>();
List<String> duplicates = new ArrayList<>();

for (Animal cat: animals) {
    if (!unique.add(cat.getName())) {
        duplicates.add(cat.getName());
    }
}
return duplicates;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法简化这个?我是Java流的新手,我尝试使用Map,但我采用了传统的for循环.

java list set java-8 java-stream

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

Java 8流-嵌套映射到列表

firstlist
  .stream()
  .map( x -> { 
            return secondList
               .stream()
               .map( y -> { //return a string } )
               .collect(Collectors.toList()) // "Output" I need
              }
       )
    .//Get the "Output" here
Run Code Online (Sandbox Code Playgroud)

我有两个清单。第一个列表中的项目必须与第二个列表进行比较,并且必须建立新的列表。

样本输入

List 1 : [ { "id" ; 3, "names" : ["test","test2"] }]
List 2 : [ {"name": :"test" , "age" :3}]
Run Code Online (Sandbox Code Playgroud)

输出:

List 3 : [ {"id" : 3, "name" : "test", "age" :3} ]
Run Code Online (Sandbox Code Playgroud)

PS:names应该对照第二个清单检查第一个清单中的清单

java list hashmap java-8 java-stream

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

列出不同的元素,包括Java Streams的计数

我想知道是否可以使用单个Java Steam语句打印出集合中的唯一元素并包括每个元素的计数。

例如,如果我有:

List<String> animals = Arrays.asList("dog", "cat", "pony", "pony", "pony", "dog");
Run Code Online (Sandbox Code Playgroud)

我想打印流:

cat - 1
dog - 2
pony - 3
Run Code Online (Sandbox Code Playgroud)

java count distinct java-stream

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