我有一堆通用项目。我想打印第一个项目的类名+ toString()所有项目的类名。
如果我有一个Iterable,它将看起来像这样:
Iterable<E> itemIter = ...;
boolean first = true;
for (E e : itemIter) {
if (first) {
first = false;
System.out.println(e.getClass().getSimpleName());
}
System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)
我可以Stream<T>使用流API 在流()上执行此操作吗?
*请注意,这是关于流的问题,而不是关于迭代器的问题。我有一个流-没有迭代器。
我有以下lambda表达式,如果bonusScheduleDurationContainers不为空则工作正常.如果它是空的,我会得到一个NoSuchElementException.我如何在lambda表达式中检查这个?
final List<ScheduleDurationContainer> bonusScheduleDurationContainers
= scheduleDurationContainersOfWeek.stream()
.filter(s -> s.getContainerType() == ScheduleIntervalContainerTypeEnum.BONUS)
.collect(Collectors.toList());
final ScheduleDurationContainer bonusScheduleDurationContainer
= bonusScheduleDurationContainers.stream()
.filter(s -> s.getDayOfWeekStartingWithZero() == dayOfWeekTmp)
.findFirst()
.get();
Run Code Online (Sandbox Code Playgroud) 我读了一些关于如何创建有限的问题Stream(
在Java中有限生成的流 - 如何创建一个?,流如何停止?).
答案建议实施一个Spliterator.在Spliterator将实现逻辑如何和元件,以提供为下一个(tryAdvance).但也有其他两个非默认的方法trySplit和estimateSize()我将不得不执行.
JavaDoc Spliterator说:
用于遍历和分区源元素的对象.a覆盖的元素源
Spliterator可以是例如阵列,aCollection,IO通道或生成器函数....Spliterator除了顺序遍历之外,API还支持有效的并行遍历,支持分解以及单元素迭代....
另一方面,我可以实现逻辑如何前进到a周围的下一个元素Stream.Builder并绕过a Spliterator.在每次前进时我都会打电话accept或者add最后打电话build.所以它看起来很简单.
JavaDoc说什么?
一个可变的建设者
Stream.这允许Stream通过单独生成元素并将它们添加到Builder(无需使用ArrayList作为临时缓冲区的复制开销)来创建.
使用StreamSupport.stream我可以用a Spliterator来获取Stream.并且Builder还将提供一个Stream.
什么时候应该/我可以使用Stream.Builder?
只有当a Spliterator不会更高效时(例如因为无法对源进行分区并且无法估计其大小)?
我想对Java流使用一条语句。
我要筛选所有要求为“ true”的Servicework对象,然后检查所有Servicework对象的状态是否为“完成”。
但是,如果serviceworkList ist为空,则变量“ validate”为false。我知道allMatch的规范,即如果list为空,则返回true。
关于如何重建流的任何建议,如果list ist为空,我将得到false?
public class Service{
List<ServiceWork> serviceWorkList = new ArrayList<>();
boolean validate = serviceWorkList
.stream()
.filter(ServiceWork::isRequirement)
.allMatch(a -> a.getStatus() == Status.DONE);
}
Run Code Online (Sandbox Code Playgroud)
class ServiceWork {
private Status status;
private boolean isRequirement;
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public boolean isRequirement() {
return isRequirement;
}
public void setRequirement(boolean requirement) {
isRequirement = requirement;
}
}
Run Code Online (Sandbox Code Playgroud)
enum Status {
DONE, NOT_DONE
}
Run Code Online (Sandbox Code Playgroud) 我有一个方法,效果很好。这就是它的样子。
private boolean roomWithMoreThanTenFurnitures(Building building) {
if (building != null && building.hasRooms()) {
for (Room room : building.getRooms()) {
if (room.getFurnitures.size() > 10) {
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我想把它切换到 Lambda。uo 是用 shell 进来的,但是我不知道外面如何填写 if(条件) return true 或 return false。
building.getRooms().forEach(room -> {
//??
});
Run Code Online (Sandbox Code Playgroud)