在Java 8中,我们有Stream <T>类,它奇怪地有一个方法
Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)
所以你会期望它实现接口Iterable <T>,这需要完全这个方法,但事实并非如此.
当我想使用foreach循环遍历Stream时,我必须做类似的事情
public static Iterable<T> getIterable(Stream<T> s) {
return new Iterable<T> {
@Override
public Iterator<T> iterator() {
return s.iterator();
}
};
}
for (T element : getIterable(s)) { ... }
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我想知道为什么Iterable界面不提供stream()和parallelStream()方法.考虑以下课程:
public class Hand implements Iterable<Card> {
private final List<Card> list = new ArrayList<>();
private final int capacity;
//...
@Override
public Iterator<Card> iterator() {
return list.iterator();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个Hand的实现,因为你可以在玩卡片游戏时手中拿着牌.
基本上它包装a List<Card>,确保最大容量并提供一些其他有用的功能.最好直接实现它作为一个List<Card>.
现在,为了方便起见,我认为实现它会很好Iterable<Card>,这样如果你想循环它就可以使用增强的for循环.(我的Hand班级也提供了一种get(int index)方法,因此Iterable<Card>在我看来是合理的.)
该Iterable接口提供以下内容(省略javadoc):
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> …Run Code Online (Sandbox Code Playgroud) 我有以下集合类型:
Map<String, Collection<String>> map;
Run Code Online (Sandbox Code Playgroud)
我想map.size()从每个Key的集合中的单个值创建每个组的唯一组合.
例如,假设地图如下所示:
A, {a1, a2, a3, ..., an}
B, {b1, b2, b3, ..., bn}
C, {c1, c2, c3, ..., cn}
Run Code Online (Sandbox Code Playgroud)
我希望获得的List<Set<String>>结果是一个结果,看起来类似于(排序并不重要,它只需要是一个由所有可能的组合组成的'完整'结果):
{a1, b1, c1},
{a1, b1, c2},
{a1, b1, c3},
{a1, b2, c1},
{a1, b2, c2},
{a1, b2, c3},
...
{a2, b1, c1},
{a2, b1, c2},
...
{a3, b1, c1},
{a3, b1, c2},
...
{an, bn, cn}
Run Code Online (Sandbox Code Playgroud)
这基本上是一个计数问题,但我想看看是否可以使用Java 8流解决方案.
在阅读API时,DirectoryStream我错过了很多功能.首先,它建议使用for循环从流到List.我想念它DirectoryStream不是一个事实Stream.
我怎样才能让一个Stream<Path>从DirectoryStreamJava中8?
有了Iterable<T>,很容易:
T last = null;
for (T t : iterable) {
if (last != null && last.compareTo(t) > 0) {
return false;
}
last = t;
}
return true;
Run Code Online (Sandbox Code Playgroud)
但我想不出一个干净的方法来做同样的事情Stream<T>,避免消耗所有元素,而不必.
我正在将 Google Guava 库的一些用法重构为Cactoos库,但我很难找出 Function 类和 Iterables.transform 方法的等效实现,使用 Cactoos 库作为替代。
新加入的文本(
” “,
可迭代对象.transform(
回购.语言(),
新函数(){
@覆盖
公共字符串应用(最终语言lang){
return String.format("#%s", lang.name());
}
}
)
).asString()
Cactoos 中两者的正确等效实现是什么?
是否可以通过流 API 来完成?
将员工列表直接放入 CSV 的列表集合中?
这非常简单,但我看到了许多变种,我在其他地方看不到自己的做法.鉴于:
Iterable<String> strings;
Run Code Online (Sandbox Code Playgroud)
创建一个包含所有字符串的String,以逗号分隔.
我有这段代码,从具有某些条件的DeviceEvents列表中提取
List<DeviceEvent> deviceEvents = new ArrayList<>();
deviceEventService
.findAll(loggedInUser())
.filter(this::isAlarmMessage)
.iterator()
.forEachRemaining(deviceEvents::add);
private boolean isAlarmMessage (DeviceEvent deviceEvent) {
return AlarmLevelEnum.HIGH == deviceEvent.getDeviceMessage().getLevel();
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个编译错误:
The method filter(this::isAlarmMessage) is undefined for the type
Iterable<DeviceEvent>
Run Code Online (Sandbox Code Playgroud)
findAll 返回一个 Iterable<DeviceEvent> 我有一个简单的循环,可以将元素从一个添加list到另一个list。如何使用 来实现相同的结果streams?
List<User> users = new ArrayList<>();
for(User user: userRepository.findAll()) {
users.add(user);
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为
userRepository.findAll() 回报 Iterable<User>