Java 8流过滤器,使用列表作为条件

时间:2018-08-20 10:32:18

标签: java filter java-8 java-stream

您好,我是Java 8的新手,请耐心等待我:)

我有一个返回对象的自定义列表的方法。我需要做的是:我有一个disabledPaymentTypesStrings的列表-我不知道它有多少个元素。如何更改我的代码,以便不编写像!paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(1))这样的所有条件?我想将我的整个列表“ disabledPaymentTypesStrings”作为条件放置在这里,但是我不知道该怎么做。请给我一些提示或建议:)

private List<PaymentType> listOfPaymentTypesForChangePayment(OrderPaymentTypeParameters paymentTypeParameters) {

        List<String> disabledPaymentTypesStrings = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()));

        return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters).stream()
            .filter(paymentType ->
                !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(0)) &&
                !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(1)) &&
                !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(2)))
            .collect(toList());
    }

3 个答案:

答案 0 :(得分:3)

一种流方法可以包括filter()来流传输字符串列表,并保留PaymentType元素,其中paymentType.getName()与字符串列表的任何元素都不匹配:

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
        .stream()
        .filter(paymentType -> disabledPaymentTypesStrings.stream()
               .allMatch(ref -> !ref.equalsIgnoreCase(paymentType.getName())))
        .collect(toList());

但是您也可以使用相同的大小写来比较String。例如小写。它将简化过滤。

您可以将参考列表元素转换为小写:

List<String> disabledPaymentTypesStrings = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()))
 .stream()
 .map(String::toLowerCase)
 .collect(toList());

您可以在List.contains()中使用filter()

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
    .stream()
    .filter(paymentType -> !disabledPaymentTypesStrings.contains(paymentType.getName().toLowerCase()))
    .collect(toList());

请注意,对于大型列表,使用Set会更有效。

答案 1 :(得分:0)

使用> df <- data.frame( a=c( 1, 1, 2, 2, 3 ), b=c( 6:10 ) ); > df a b 1 1 6 2 1 7 3 2 8 4 2 9 5 3 10 > df2 <- data.frame( a=unique( df$a ) ) > temp <- dlply( df, .(a), function( x ) data.frame( bs=x$b ) ); > df2$bs <- lapply( temp, function( x ) x$bs ) > df2 a bs 1 1 6, 7 2 2 8, 9 3 3 10 > 。但是您必须考虑忽略大小写的问题

contains()

答案 2 :(得分:0)

这两个步骤都需要在普通情况下具有值(无论是大写还是小写,我都希望小写)

List<String> disabledPaymentTypesStringsLowerCase = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()))
 .stream()
 .map(String::toLowerCase)
 .collect(toList());

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
    .stream()
    .map(paymentType -> paymentType.getName())
    .map(String::toLowerCase)
    .filter(disabledPaymentTypesStrings::contains)
    .collect(toList());

如果已知paymentType类,则可以进一步重构此代码,假设paymentType类为 PaymentType 代码,如下所示,

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
    .stream()
    .map(PaymentType::getName)
    .map(String::toLowerCase)
    .filter(disabledPaymentTypesStrings::contains)
    .collect(toList());