具有混合输入内容的Stream.of

时间:2017-05-30 09:31:48

标签: java java-8 java-stream

我想知道是否可以替换以下代码:

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类型。这些代码只是问题的一个简单例子。

4 个答案:

答案 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);