与JDK 7或更低版 本相比,使用流的最佳方法

问题描述 投票:-2回答:1

我们有一个具有某些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));
    }
}
java list java-8 stream
1个回答
0
投票

您的第一个实现次优,而第二个实现有错误。您不需要进行迭代(您可以使用流管道进行多次操作)。最简单的实现可以使用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有什么问题?您正在覆盖值(由于[C​​0]而设置为true的值将在以下迭代中设置为"F"

© www.soinside.com 2019 - 2024. All rights reserved.