我正在查看文档IntStream,我看到了一种toArray方法,但没有办法直接进入List<Integer>
当然有一种方法可以将a转换Stream为List?
我想知道为什么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) 我可以添加流或额外的元素,如下所示:
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)无论如何,有没有更好的方法呢?
如何在以下代码中获取流或列表的最后一个元素?
哪里data.careas是List<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并不难.
然而,获得单行中的最后一个元素是一个真正的痛苦:
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每个元素,这很可能不是您通常想要的,因为它可能会影响性能.
我已将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 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) 我正在阅读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这段代码返回了什么样的具体内容?
List<Shape>,这是完全正常的.stream()也filter()决定使用哪种列表.Collectors.toList()既没有指定具体的类型List.那么,这里使用的具体类型(子类)List是什么?有保证吗?
我有以下实现,给出了编译器错误:
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) 说我有一个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.
目前我们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 ×10
java-8 ×8
java-stream ×3
interface ×2
lambda ×2
list ×2
collectors ×1
concat ×1
enums ×1
generics ×1
inheritance ×1
map ×1