81、给定一个有限的字符串流,求字符串的平均长度。
可以使用流的 mapToInt 方法将字符串流转换为包含字符串长度的 IntStream ,再使用 average 方法计算平均长度。示例代码如下:
Stream<String> stringStream = ...;
double averageLength = stringStream.mapToInt(String::length).average().orElse(0);
82、你的经理要求你编写一个方法 public static boolean isFinite(Stream stream)。为什么这不是个好主意?不过还是请你把它写出来。
这不是个好主意的原因在于,流(Stream)可以是无限的,也可以是有限的,并且流具有惰性求值的特性,在调用终端操作之前,流的元素不会被实际处理。要判断一个流是否有限,可能需要遍历整个流,这对于无限流来说会导致程序无法终止。
以下是实现该方法的代码示例:
import java.util.stream.Stream;
public class StreamUtils {
public static <T> boolean isFinite(Stream<T> stream) {
try {
stream.limit(1).forEach(e -> {});
return true;
} catch (IllegalStateException e) {
return false;
}
}
}
上述代码尝试对流进行 limit(1) 操作并执行 forEach 终端操作,如果流是无限的,在某些情况下会抛出 IllegalStateException ,通过捕获该异常来判断流是否有限。但这种方法并不完美,因为不同的流实现可能有不同的行为。
83、编写一个公共静态方法 public static <T> Stream<T> zip(Stream<T> first, Stream<T> second) ,该方法交替输出 first 和 second 流中的元素(如果轮到的流元素耗尽,则输出 null )。
以下是实现该方法的 Java 代码:
import java.util.stream.Stream;
public class StreamZipper {
public static <T> Stream<T> zip(Stream<T> first, Stream<T> second) {
java.util.Iterator<T> iterator1 = first.iterator();
java.util.Iterator<T> iterator2 = second.iterator();
java.util.stream.Stream.Builder<T> builder = Stream.builder();
while (iterator1.hasNext() || iterator2.hasNext()) {
if (iterator1.hasNext()) {
builder.add(iterator1.next());
} else {
builder.add(null);
}
if (iterator2.hasNext()) {
builder.add(iterator2.next());
} else {
builder.add(null);
}
}
return builder.build();
}
}
你可以使用以下方式调用这个方法:
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream<Integer> first = Stream.of(1, 3, 5);
Stream<Integer> second = Stream.of(2, 4, 6);
Stream<Integer> zipped = StreamZipper.zip(first, second);
zipped.forEach(System.out::

最低0.47元/天 解锁文章
1332

被折叠的 条评论
为什么被折叠?



