2012-06-13 25 views
0

我試圖熟悉lambdaj,我不確定如何解決這個問題的最佳途徑。鑑於以下測試:大小寫不敏感的過濾與lambdaj

@Test 
public void test() { 
    final List<String> l1 = new ArrayList<>(); 
    final List<String> l2 = new ArrayList<>(); 

    l1.add("same"); 
    l1.add("Upper"); 
    l1.add("lower"); 

    l2.add("same"); 
    l2.add("upper"); 
    l2.add("lower"); 
    l2.add("extra"); 

    final List<String> l3 = Lambda.filter(Matchers.not(Matchers.isIn(l1)), l2); 
    Assert.assertThat("There should be one item in l3", l3.size(), Matchers.equalTo(1)); 
} 

我怎樣才能讓匹配器不關心呢?即我想要列出不在l1中的l2中的項目,而不管情況如何?我寧願不必運行另一個Lambda來將每個字符串列表轉換爲相同的大小寫,但是卻可以根據需要修改匹配器。這是可能的還是我必須首先將這些項目轉換爲同一個案例?

+0

最簡單的辦法是隻讓一切小寫/大寫 –

回答

0

這個工作對我來說:

import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; 
//.. 
List<String> allJedis = asList("Luke","Obiwan","Yoda"); 
List<String> someJedis = filter(equalToIgnoringCase("obiwan"), allJedis); 
System.out.println(someJedis); 

輸出是[Obiwan]

+0

,對於工程一個單一的元素,但不是問題中的多列表(這是動態的),我只是爲這個問題創建了最小的可重複測試用例。 – Scott

0

希望這個答案可以幫助你:

List<String> convert = convert(list1, new Converter<String, String>() { 
     @Override 
     public String convert(String from) { 
      return from.toLowerCase(); 
     } 
    }); 
    List<String> filter2 = filter(isIn(list2), convert); 

    System.out.println("filter2 -> " + filter2); 
    // filter2 -> [same, upper, lower]