小编ski*_*iwi的帖子

如何将Java 8 IntStream转换为List?

我正在查看文档IntStream,我看到了一种toArray方法,但没有办法直接进入List<Integer>

当然有一种方法可以将a转换StreamList

java java-8

264
推荐指数
4
解决办法
7万
查看次数

为什么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流或一个额外元素添加到流中

我可以添加流或额外的元素,如下所示:

Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element));
Run Code Online (Sandbox Code Playgroud)

我可以随时添加新内容,如下所示:

Stream stream = Stream.concat(
                       Stream.concat(
                              stream1.filter(x -> x!=0), stream2)
                              .filter(x -> x!=1),
                                  Stream.of(element))
                                  .filter(x -> x!=2);
Run Code Online (Sandbox Code Playgroud)

但这很难看,因为它concat是静态的.如果concat是实例方法,上面的示例将更容易阅读:

 Stream stream = stream1.concat(stream2).concat(element);
Run Code Online (Sandbox Code Playgroud)

 Stream stream = stream1
                 .filter(x -> x!=0)
                 .concat(stream2)
                 .filter(x -> x!=1)
                 .concat(element)
                 .filter(x -> x!=2);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)concat静态有什么好的理由吗?或者是否有一些我缺少的等效实例方法?

2)无论如何,有没有更好的方法呢?

java concat java-8 java-stream

162
推荐指数
4
解决办法
11万
查看次数

在一行中获取流/列表的最后一个元素

如何在以下代码中获取流或列表的最后一个元素?

哪里data.careasList<CArea>:

CArea first = data.careas.stream()
                  .filter(c -> c.bbox.orientationHorizontal).findFirst().get();

CArea last = data.careas.stream()
                 .filter(c -> c.bbox.orientationHorizontal)
                 .collect(Collectors.toList()).; //how to?
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,获得第一个元素filter并不难.

然而,获得单行中的最后一个元素是一个真正的痛苦:

  • 好像我不能直接从a获得它Stream.(它只对有限流有意义)
  • 这似乎也不能得到像first()last()List接口,这实在是一种痛苦.

我没有看到任何关于不在接口中提供first()last()方法的论据List,因为其中的元素是有序的,而且大小是已知的.

但根据原始答案:如何获得有限的最后一个元素Stream

就个人而言,这是我能得到的最接近的:

int lastIndex = data.careas.stream()
        .filter(c -> c.bbox.orientationHorizontal)
        .mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Run Code Online (Sandbox Code Playgroud)

然而,它确实涉及使用indexOf每个元素,这很可能不是您通常想要的,因为它可能会影响性能.

java list java-8 java-stream

100
推荐指数
5
解决办法
7万
查看次数

Java未选中:为varargs参数创建未经检查的通用数组

我已将Netbeans设置为在我的Java代码中显示未经检查的警告,但我无法理解以下行中的错误:

private List<String> cocNumbers;
private List<String> vatNumbers;
private List<String> ibans;
private List<String> banks;
...
List<List<String>> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans);
Run Code Online (Sandbox Code Playgroud)

得到:

[unchecked] unchecked generic array creation for varargs parameter of type List<String>[]

方法来源:

/**
 * Returns a list of all possible combinations of the entered array of lists.
 *
 * Example: [["A", "B"], ["0", "1", "2"]]
 * Returns: [["A", "0"], ["A", "1"], ["A", "2"], ["B", "0"], ["B", "1"], ["B", "2"]]
 *
 * @param <T> The type parameter
 * @param elements …
Run Code Online (Sandbox Code Playgroud)

java generics variadic-functions

96
推荐指数
2
解决办法
4万
查看次数

默认方法返回true一段时间,然后返回false?(可能的JVM错误)

我有一个问题,下面的代码,我隔离到最封闭的形式,我使用Java 8,几乎准备好发布(2014年3月18日),所以我希望在实现本身没有严重的问题,所以它可能/必须是我自己的代码:

注意:代码是用Java 8编写的,它具有各种新功能,包括default接口中的方法实现.

public abstract class Drawable implements DrawableInterface {    

}
Run Code Online (Sandbox Code Playgroud)
interface DrawableInterface {
    default public boolean isShadowReceiver() {
        return false;
    }

    default public boolean isShadowCaster() {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)
public interface ShadowDrawable extends DrawableInterface {
    @Override
    default public boolean isShadowReceiver() {
        return true;
    }

    @Override
    default public boolean isShadowCaster() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Box extends Drawable implements ShadowDrawable {

}
Run Code Online (Sandbox Code Playgroud)
public class IsolatedBug {
    private final Box box;

    private final List<Drawable> drawables; …
Run Code Online (Sandbox Code Playgroud)

java inheritance interface java-8

66
推荐指数
1
解决办法
2816
查看次数

Collectors.toList()返回什么样的List <E>?

我正在阅读Lambda:Libraries Edition的状态,我对一个声明感到惊讶:

Streams部分下,有以下内容:

List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

该文件没有说明shapes实际是什么,我不知道它是否重要.

令我困惑的是:List这段代码返回了什么样的具体内容?

  • 它将变量赋值给a List<Shape>,这是完全正常的.
  • stream()filter()决定使用哪种列表.
  • Collectors.toList()既没有指定具体的类型List.

那么,这里使用的具体类型(子类)List是什么?有保证吗?

java lambda list java-8 collectors

61
推荐指数
2
解决办法
5万
查看次数

在枚举中实现内部接口时的循环继承

我有以下实现,给出了编译器错误:

public enum FusionStat implements MonsterStatBuilderHelper {
    ATTACK {
        @Override
        public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            Objects.requireNonNull(baseMonsterCard);
            Objects.requireNonNull(fusedMonsterCard);
            Objects.requireNonNull(fusionCard);
            if (baseMonsterCard.equals(fusedMonsterCard)) {
                throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
            }
            return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
                    .attack(baseMonsterCard.getAttack() + (fusionCard.getFusionPower() * fusedMonsterCard.getAttack()));
        }
    },

    HITPOINTS {
        @Override
        public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            Objects.requireNonNull(baseMonsterCard);
            Objects.requireNonNull(fusedMonsterCard);
            Objects.requireNonNull(fusionCard);
            if (baseMonsterCard.equals(fusedMonsterCard)) {
                throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
            }
            return …
Run Code Online (Sandbox Code Playgroud)

java enums interface

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

如何在Java 8中映射地图中的值?

说我有一个Map<String, Integer>.有一种简单的方法可以从中得到Map<String, String>它吗?

通过简单,我的意思是不喜欢这样:

Map<String, String> mapped = new HashMap<>();
for(String key : originalMap.keySet()) {
    mapped.put(key, originalMap.get(key).toString());
}
Run Code Online (Sandbox Code Playgroud)

而是一些像以下一样的班轮:

Map<String, String> mapped = originalMap.mapValues(v -> v.toString());
Run Code Online (Sandbox Code Playgroud)

但显然没有办法mapValues.

java lambda map java-8

52
推荐指数
2
解决办法
6万
查看次数

Java 8是否缺少Stream.concat处理流的varags?

目前我们Stream.concat在Java 8中有以下内容:

public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b);
Run Code Online (Sandbox Code Playgroud)

我很惊讶为什么没有版本采取varargs Stream<? extends T>

目前我的代码编写如下:

Stream<Integer> resultStream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element)))
        .filter(x -> x != 0)
        .filter(x -> x != 1)
        .filter(x -> x != 2);
Run Code Online (Sandbox Code Playgroud)

如果提供此签名的varargs:

public static <T> Stream<T> concat(Stream<? extends T>... streams);
Run Code Online (Sandbox Code Playgroud)

然后我可以更清楚地写出:

Stream<Integer> resultStream = Stream.concat(
                stream1,
                stream2,
                Stream.of(element)
        )
        .filter(x -> x != 0)
        .filter(x -> x != 1)
        .filter(x -> x != 2);
Run Code Online (Sandbox Code Playgroud)

没有各种嵌套Stream.concat调用.

还是有其他原因没有提供? …

java java-8 java-stream

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