2017-05-30 74 views
2

我想知道如果Stream.of这将有可能取代下面的一段代码:混合输入的内容

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)工作不“扁平化”的内容。

任何想法?我是在做一些不存在的东西吗?

谢谢

PS。我不知道forEach调用之前的Object类型。这些代码只是这个问题的一个简单例子。

回答

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,你可以做一些事情LIK Ë

​​

但我认为这仍然丑如您原始的方法...

+0

实际上,这部分解决了这个问题。我主要关心的是**我不知道调用之前的对象类型,它可以是列表或单个对象,我希望在之后进行流式处理。因为我不知道对象类型,我不能在已经存在的列表上执行'Collections.singletonList' ... – Jerome

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); 
+3

这可能仅仅是一个个人喜好的问题,但我觉得它更容易阅读旧式'流流= (o实例列表? ((列表)o).stream():Stream.of(o);'而不是'Optional'上的一系列方法调用。 –

+0

@KlitosKyriacou,我同意。如果java支持像'List(-2, - 4,5,7,1)分区(x => x> 0)'这样的分区,它会返回负数列表和正整数列表,那将会很好。 –

1

这个什么(它不会使其更具可读性的你已经到位IMO)

Stream.of(o).flatMap(
        x -> x instanceof List<?> ? ((List<?>) x).stream() : Stream.of(x)) 
       .forEach(System.out::println); 
+0

很多电话没有那么多的好处:/ – Jerome

+0

@Jerome很好,如果我们知道你可以把'o'改成'List',事情会简单得多,但你已经有了答案。 – Eugene

+0

我知道,我编辑了我的帖子,实际上我不知道在调用之前,如果'o'是一个列表或单个对象 – Jerome

1

最好的办法是重构代码以使你不工作一个Object,但或者 a List或任何其他类型。

如果这是不可能的,你真的需要通过列表流?列表上会有一个简单的System.out.println()吗?这将使下面的输出:

[托托,塔塔,蒂蒂]

如果你真的需要打印在单独的行内容,你无法避免向下转型的ObjectList,因为您需要调用其上的stream()方法。我真的能想出这里唯一的事情是把铸件在隔离代码的方法:

private <T> Stream<T> toStream(T object) { 
    return object instanceof List ? ((List) object).stream() : Stream.of(object); 
} 

然后,只需调用该方法o

toStream(o).forEach(System.out::println); 
+0

我无法避免使用对象,因为真正的代码要复杂得多,而且非常通用。你的解决方案肯定会起作用,但我认为它与基础版一样丑陋。 – Jerome

+0

@Jerome同意,但正如我在我的回答中所说的那样,这是强制施加应该重构的代码。除了向下投下物体之外别无他法。 – Magnilex