2017-05-30 80 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