双流
Double a stream
我想加倍 Stream (no DoubleStream)。这意味着我从一个流开始,并希望获得一个新流,其中旧流的每个元素都流式传输两次。所以 1,2,3,4,4,5 给我们 1,1,2,2,3,3,4,4,4,4,5,5。有这样的流操作吗?
创建一个包含当前元素两次的内部流和 flatMap 这个流。
stream.flatMap(e -> Stream.of(e,e))
如果你想将元素的数量乘以 n
,你可以创建一个像这样的实用方法:
public static <T> Stream<T> multiplyElements(Stream<T> in, int n) {
return in.flatMap(e -> IntStream.range(0, n).mapToObj(i -> e));
// we can also use IntStream.rangeClosed(1, n)
// but I am used to iterating from 0 to n (where n is excluded)
}
(但尝试为该方法使用更好的名称,因为当前名称可能不明确)
用法示例:
multiplyElements(Stream.of(1,2), 3).forEach(System.out::println);
输出:
1
1
1
2
2
2
您可以为每个原始元素创建一个包含 2 个元素的流并将其平面映射:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 4, 5);
List<Integer> doubled = list.stream().flatMap(i -> Stream.of(i, i)).collect(toList());
下面是 biziclop 在评论中描述的一个简单示例。
static <E> Collection<E> multiply(Collection<E> source, int count) {
return new AbstractCollection<E>() {
@Override
public int size() {
return count * source.size();
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
final Iterator<E> it = source.iterator();
E next;
int i = 0;
@Override
public boolean hasNext() {
return i < size();
}
@Override
public E next() {
if (hasNext()) {
if ((i % count) == 0) {
next = it.next();
}
++i;
return next;
} else {
throw new NoSuchElementException();
}
}
};
}
};
}
(Ideone 上的工作示例。)
CW'd 因为这不是我的想法,flatMap
建议更直接地回答了这个问题。
我想加倍 Stream (no DoubleStream)。这意味着我从一个流开始,并希望获得一个新流,其中旧流的每个元素都流式传输两次。所以 1,2,3,4,4,5 给我们 1,1,2,2,3,3,4,4,4,4,5,5。有这样的流操作吗?
创建一个包含当前元素两次的内部流和 flatMap 这个流。
stream.flatMap(e -> Stream.of(e,e))
如果你想将元素的数量乘以 n
,你可以创建一个像这样的实用方法:
public static <T> Stream<T> multiplyElements(Stream<T> in, int n) {
return in.flatMap(e -> IntStream.range(0, n).mapToObj(i -> e));
// we can also use IntStream.rangeClosed(1, n)
// but I am used to iterating from 0 to n (where n is excluded)
}
(但尝试为该方法使用更好的名称,因为当前名称可能不明确)
用法示例:
multiplyElements(Stream.of(1,2), 3).forEach(System.out::println);
输出:
1
1
1
2
2
2
您可以为每个原始元素创建一个包含 2 个元素的流并将其平面映射:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 4, 5);
List<Integer> doubled = list.stream().flatMap(i -> Stream.of(i, i)).collect(toList());
下面是 biziclop 在评论中描述的一个简单示例。
static <E> Collection<E> multiply(Collection<E> source, int count) {
return new AbstractCollection<E>() {
@Override
public int size() {
return count * source.size();
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
final Iterator<E> it = source.iterator();
E next;
int i = 0;
@Override
public boolean hasNext() {
return i < size();
}
@Override
public E next() {
if (hasNext()) {
if ((i % count) == 0) {
next = it.next();
}
++i;
return next;
} else {
throw new NoSuchElementException();
}
}
};
}
};
}
(Ideone 上的工作示例。)
CW'd 因为这不是我的想法,flatMap
建议更直接地回答了这个问题。