相关疑难解决方法(0)

为什么Stream <T>没有实现Iterable <T>?

在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)

我在这里错过了什么吗?

java iterable java-8 java-stream

254
推荐指数
5
解决办法
3万
查看次数

为什么Iterable <T>不提供stream()和parallelStream()方法?

我想知道为什么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)

java java-8

234
推荐指数
3
解决办法
3万
查看次数

如何使用Java 8流制作笛卡尔积?

我有以下集合类型:

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流解决方案.

java cartesian-product java-8 java-stream

28
推荐指数
6
解决办法
1万
查看次数

如何从DirectoryStream创建流

在阅读API时,DirectoryStream我错过了很多功能.首先,它建议使用for循环从流到List.我想念它DirectoryStream不是一个事实Stream.

我怎样才能让一个Stream<Path>DirectoryStreamJava中8?

java java-8 java-stream

20
推荐指数
2
解决办法
5774
查看次数

我该如何检查Stream <T>是否已排序?

有了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>,避免消耗所有元素,而不必.

java java-8 java-stream

12
推荐指数
3
解决办法
3353
查看次数

将 Guava 的 Iterables.transform 和 Function 重构为 Cactoos 中的等效项

我正在将 Google Guava 库的一些用法重构为Cactoos库,但我很难找出 Function 类和 Iterables.transform 方法的等效实现,使用 Cactoos 库作为替代。

示例(来自https://github.com/yegor256/rultor/blob/b3e58634d6066f52a2a2c94e44033b37e7e464dd/src/test/java/com/rultor/agents/twitter/TweetsTest.java#L84):

新加入的文本(
    ” “,
    可迭代对象.transform(
        回购.语言(),
        新函数(){
            @覆盖
            公共字符串应用(最终语言lang){
                return String.format("#%s", lang.name());
            }
        }
    )
).asString()

Cactoos 中两者的正确等效实现是什么?

java oop guava cactoos

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

通过 Java Stream API 将 CSV 直接加载到对象 &lt;t&gt; 集合中

是否可以通过流 API 来完成?

将员工列表直接放入 CSV 的列表集合中?

java java-stream

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

如何发出以逗号分隔的列表?

这非常简单,但我看到了许多变种,我在其他地方看不到自己的做法.鉴于:

Iterable<String> strings;
Run Code Online (Sandbox Code Playgroud)

创建一个包含所有字符串的String,以逗号分隔.

java

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

Java 8集合:带功能的过滤器不起作用

我有这段代码,从具有某些条件的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>

java collections functional-programming java-8 java-stream

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

使用流将可迭代对象转换为列表

我有一个简单的循环,可以将元素从一个添加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>

java iterable java-stream

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