为什么以下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()创建流?
考虑以下对象:
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)
即
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)
怎么做 ?
从流中收集数据时,我遇到了一个令人讨厌的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提供的答案确实正确。
我在运行以下代码时遇到错误:
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) 比方说我有一个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 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) 我有关于范围,流和重新分配的问题.
我想知道是否有办法使用流式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)
编辑:
我也明白我可以返回一个值.正如我在问题中所说的那样,我特意要求一种方法来利用好奇心来实现这一点.
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循环.
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 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)