我们有一个具有某些boolean
属性的实体(例如配置)。我们得到的配置为String[]
,需要与专门为此配置定义的Enum
值进行比较,并分别设置其值。我们在Streams
(JDK 8)和经典for-each
循环中进行了尝试,发现第二个选项更好。有没有更好的方法在Stream中编写代码?
public void setService(Service service) {
List<String> filters = Arrays.asList(new String[] {"F", "T", "C"});
// with stream - every time stream needs to be taken
service.setFeeEnabled(filters.stream().filter(filter -> ServiceManagerConfigurationEnum.FEE_ENABLED.getServiceValue().equals(filter)).findFirst().isPresent());
service.setCommissionEnabled(filters.stream().filter(filter -> ServiceManagerConfigurationEnum.COMMISSION_ENABLED.getServiceValue().equals(filter)).findFirst().isPresent());
service.setTaxEnabled(filters.stream().filter(filter -> ServiceManagerConfigurationEnum.TAX_ENABLED.getServiceValue().equals(filter)).findFirst().isPresent());
service.setCashBackEnabled(filters.stream().filter(filter -> ServiceManagerConfigurationEnum.CASHBACK_ENABLED.getServiceValue().equals(filter)).findFirst().isPresent());
// with for-each loop only iterated once for the list size
for(String filter : filters) {
service.setFeeEnabled(ServiceManagerConfigurationEnum.FEE_ENABLED.getServiceValue().equals(filter));
service.setCommissionEnabled(ServiceManagerConfigurationEnum.COMMISSION_ENABLED.getServiceValue().equals(filter));
service.setTaxEnabled(ServiceManagerConfigurationEnum.TAX_ENABLED.getServiceValue().equals(filter));
service.setCashBackEnabled(ServiceManagerConfigurationEnum.CASHBACK_ENABLED.getServiceValue().equals(filter));
}
}
您的第一个实现次优,而第二个实现有错误。您不需要进行迭代(您可以使用流管道进行多次操作)。最简单的实现可以使用contains
:
Set<String> filters = new HashSet<>(Arrays.asList(new String[] {"F", "T", "C"}));
service.setFeeEnabled(filters.contains(
ServiceManagerConfigurationEnum.FEE_ENABLED.getServiceValue()));
service.setCommissionEnabled(filters.contains(
ServiceManagerConfigurationEnum.COMMISSION_ENABLED.getServiceValue()));
service.setTaxEnabled(filters.contains(
ServiceManagerConfigurationEnum.TAX_ENABLED.getServiceValue()));
service.setCashBackEnabled(filters.contains(
ServiceManagerConfigurationEnum.CASHBACK_ENABLED.getServiceValue());
您的for-for有什么问题?您正在覆盖值(由于[C0]而设置为true的值将在以下迭代中设置为"F"
)