我想知道是否可以替换以下代码:
Object o;
// o can be one of the two following things
o = Arrays.asList("Toto", "tata", "Titi");
o = "Test";
if (o instanceof List<?>) {
((List<?>) o).stream().forEach(System.out::println);
} else {
System.out.println(o);
}
使用Stream.of
更难看的东西。我想到了这个:
Object o;
// o can be one of the two following things
o = Arrays.asList("Toto", "tata", "Titi");
o = "Test";
Stream.of(o).forEach(System.out::println);
但显然它不起作用,因为Stream.of(aList)
没有&#34;变平&#34;它的内容。
有什么想法吗?我是在梦想一些不存在的东西吗?
谢谢
PS。在Object
电话之前,我不知道forEach
类型。这些代码只是问题的一个简单例子。
答案 0 :(得分:4)
如果你想要“不那么难看”的东西,你不应该首先将数据类型扩展到Object
:
List<String> o;
// o can be one of the two following things
o = Arrays.asList("Toto", "tata", "Titi");
o = Collections.singletonList("Test");
o.forEach(System.out::println);
当然,如果您有Object
,则可以执行类似
(o instanceof List? ((List<?>)o).stream(): Stream.of(o)).forEach(System.out::println);
但我认为这仍然像你原来的做法一样难看......
答案 1 :(得分:1)
这个怎么样(它不会让你对IMO已经拥有的东西更具可读性)
Stream.of(o).flatMap(
x -> x instanceof List<?> ? ((List<?>) x).stream() : Stream.of(x))
.forEach(System.out::println);
答案 2 :(得分:1)
最好的选择是重构代码,这样您就无法使用Object
,但 一个List
或其他任何类型。< / p>
如果那是不可能的,你真的需要在列表中流式传输吗?列表上的简单System.out.println()
会这样吗?这将给出以下输出:
[Toto,tata,Titi]
如果您确实需要在单独的行中打印内容,无法避免将Object
向下转换为List
,因为您需要调用{{ 1}}方法就可以了。我在这里唯一能想到的就是将转换放在一个隔离代码的方法中:
stream()
然后只需使用private <T> Stream<T> toStream(T object) {
return object instanceof List ? ((List) object).stream() : Stream.of(object);
}
:
o
答案 3 :(得分:0)
看起来很难看,但这样的事情怎么样?
Stream stream =
Optional.of(o).
filter(x -> x instanceof List).
map(x -> ((List) x).stream()).
orElse(Stream.of(o));
stream.forEach(System.out::println);