如何 return java 中拆分器的下一个元素
How to return the next element from a spliterator in java
我想从拆分器中获取下一个元素,而不仅仅是下一个元素的 "perform action"。例如通过实现下面的方法
<T> T getnext(Spliterator<T> s) {
}
我发现的所有搜索结果都说 tryAdvance() 就像迭代器 hasNext() 和 next() 的组合,除了这是一个大谎言,因为我无法获得下一个元素,只是 "perform action on next element".
没有直接的方法,但您可以使用:
<T> T getnext(Spliterator<T> s) {
Stream<T> stream = StreamSupport.stream(s, false); // convert Spliterator to stream
Iterable<T> iterable = stream::iterator; // then stream to Iterable
return iterable.iterator().next(); // then you can get next element
}
或者像这样一步到位:
return StreamSupport.stream(s, false).iterator().next();
或更简单:
return Spliterators.iterator(s).next();
您可以将项目包装在列表中,然后从该列表中 return:
public static <T> T getNext(Spliterator<T> spliterator) {
List<T> result = new ArrayList<>(1);
if (spliterator.tryAdvance(result::add)) {
return result.get(0);
} else {
return null;
}
}
为了让调用者更清楚这是一个可能 return 为空的操作,请考虑 returning Optional
:
public static <T> Optional<T> getNext(Spliterator<T> spliterator) {
final List<T> result = new ArrayList<>(1);
if (spliterator.tryAdvance(result::add)) {
return Optional.of(result.get(0));
} else {
return Optional.empty();
}
}
将拆分器转换为流
<T> Optional<T> getnext(Spliterator<T> s) {
return StreamSupport.stream(s, false).findFirst();
}
例子
List<String> lst = List.of("a", "b");
Spliterator<String> spliterator = lst.spliterator();
System.out.println(getnext(spliterator)); //Optional[a]
System.out.println(getnext(spliterator)); //Optional[b]
我想从拆分器中获取下一个元素,而不仅仅是下一个元素的 "perform action"。例如通过实现下面的方法
<T> T getnext(Spliterator<T> s) {
}
我发现的所有搜索结果都说 tryAdvance() 就像迭代器 hasNext() 和 next() 的组合,除了这是一个大谎言,因为我无法获得下一个元素,只是 "perform action on next element".
没有直接的方法,但您可以使用:
<T> T getnext(Spliterator<T> s) {
Stream<T> stream = StreamSupport.stream(s, false); // convert Spliterator to stream
Iterable<T> iterable = stream::iterator; // then stream to Iterable
return iterable.iterator().next(); // then you can get next element
}
或者像这样一步到位:
return StreamSupport.stream(s, false).iterator().next();
或更简单:
return Spliterators.iterator(s).next();
您可以将项目包装在列表中,然后从该列表中 return:
public static <T> T getNext(Spliterator<T> spliterator) {
List<T> result = new ArrayList<>(1);
if (spliterator.tryAdvance(result::add)) {
return result.get(0);
} else {
return null;
}
}
为了让调用者更清楚这是一个可能 return 为空的操作,请考虑 returning Optional
:
public static <T> Optional<T> getNext(Spliterator<T> spliterator) {
final List<T> result = new ArrayList<>(1);
if (spliterator.tryAdvance(result::add)) {
return Optional.of(result.get(0));
} else {
return Optional.empty();
}
}
将拆分器转换为流
<T> Optional<T> getnext(Spliterator<T> s) {
return StreamSupport.stream(s, false).findFirst();
}
例子
List<String> lst = List.of("a", "b");
Spliterator<String> spliterator = lst.spliterator();
System.out.println(getnext(spliterator)); //Optional[a]
System.out.println(getnext(spliterator)); //Optional[b]