gpt4 book ai didi

Java 类祖先流

转载 作者:行者123 更新时间:2023-11-30 02:15:59 24 4
gpt4 key购买 nike

如何创建Stream类祖先?

我能做的是:

public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
ArrayList<Class<?>> ancestorsList = new ArrayList<>();
while (true) {
klass = klass.getSuperclass();
if (klass == null) {
return ancestorsList.stream();
} else {
ancestorsList.add(klass);
}
}
}

但它并不优雅,而且我的流也不懒惰。如何变懒Stream

最佳答案

一种选择是使用Stream.iterate()。您必须将其与 takeWhile(在 Java 9 中引入)结合起来,以使 Stream 有限。

public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
return Stream.iterate (klass.getSuperclass(), k -> k != null ? k.getSuperclass() : null)
.takeWhile(Objects::nonNull);
}

或者,如果您不想使用 Java 9 功能,您可以编写类似于 Stream.iterate() 的方法,但使其生成有限的 Stream >:

public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
final Iterator<Class<?>> iterator = new Iterator<Class<?>>() {
@SuppressWarnings("unchecked")
Class<?> k = klass.getSuperclass ();

@Override
public boolean hasNext() {
return k != null;
}

@Override
public Class<?> next() {
Class<?> curr = k;
k = k.getSuperclass ();
return curr;
}
};
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
iterator,
Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
}

第二种方法的执行示例:

streamOfAncestors (StringBuilder.class).forEach (System.out::println);

输出:

class java.lang.AbstractStringBuilder
class java.lang.Object

编辑:

正如 Holger 评论的那样,如果您使用的是 Java 9,那么所有这些都是不必要的,Java 9 有 Stream.iterate产生有限Stream的变体。

您需要写的是:

public static Stream<Class<?>> streamOfAncestors(Class<?> klass) {
return Stream.iterate (klass.getSuperclass(), Objects::nonNull, Class::getSuperclass);
}

关于Java 类祖先流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48437152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com