您好,我是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());
}
答案 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());