【问题标题】:Case Insensitive filtering with lambdaj使用 lambdaj 进行不区分大小写的过滤
【发布时间】:2012-06-13 19:48:01
【问题描述】:

我正在尝试熟悉 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));
}

如何让 Matcher 不关心大小写?即,无论大小写如何,我都想要 l2 中不在 l1 中的项目列表?我宁愿不必运行另一个 Lambda 来将每个字符串列表转换为相同的大小写,而是一种修改 Matcher 以按照我的意愿进行操作的方法。这是可能的还是我必须先将这些项目转换为相同的情况?

【问题讨论】:

  • 最简单的事情就是把所有的东西都变成小写/大写

标签: java lambda matcher hamcrest lambdaj


【解决方案1】:

这对我有用:

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]

【讨论】:

  • 这适用于单个元素,但不适用于问题中的多列表(它是动态的),我只是为问题创建了最小的可重现测试用例。
【解决方案2】:

希望这个答案可以帮助你:

    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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多