【问题标题】:How to modify an object with condition inside a list without a loop in Java 7如何在Java 7中没有循环的列表中修改具有条件的对象
【发布时间】:2020-06-30 05:08:11
【问题描述】:

我想在Java 7中以有效的方式更改列表中的一些对象属性而没有任何循环,因为在Java 8中我们可以使用流,请不要参考任何第三方像 Guava 这样的库,因为我无法将任何新库添加到公司旧系统中。

MenuResponse.java

public class MenuResponse {

    String id;
    String title;
    String type;

    // Getters and setters omitted for brevity
}

MenuService.java

public List<MenuResponse> getMenu() {
    List<MenuResponse> data = new ArrayList<>();
    
    /* sample local data */
    MenuResponse a = new MenuResponse();
    a.setId("1");
    a.setTitle("Time Deposit");
    a.setType("OK");

    MenuResponse b = new MenuResponse();
    b.setId("2");
    b.setTitle("Account");
    b.setType("OK");

    MenuResponse c = new MenuResponse();
    c.setId("3");
    c.setTitle("Submission Wizard");
    c.setType("DISABLED");

    data.add(a);
    data.add(b);
    data.add(c);

    /* here i want to alter the title menu to "Under Maintenance" if type = 'DISABLED' */
    /* this is my best in Java 8 */
    Optional<MenuResponse> dd = data.stream()
        .filter(menu -> menu.getType().equalsIgnoreCase("DISABLED"))
        .findFirst();
    if(dd.isPresent()){
        dd.get().setTitle("Under Maintenance");
    }

    return data;
}

目标

基于上面的 sn-p 我想更新一些数组对象属性,在这种情况下,我想将 MenuResponse 的标题更改为“维护中”,以防类型等于“禁用”,但没有任何循环。

任何帮助和解释将不胜感激,谢谢

【问题讨论】:

  • 没有任何循环,你有迭代??
  • 是只修改一个对象的属性,还是修改类型为DISABLED的所有对象的属性?
  • 好吧,c.setTitle("Under Maintenance") 可以工作
  • 我认为迭代就像循环一样,顺便说一下我上面的java 8代码运行良好,现在如何在java 7中做到这一点,只有一个对象不是全部

标签: java arrays spring list


【解决方案1】:

你可以使用peek()函数:

data.stream()
    .filter(menu -> menu.getType().equalsIgnoreCase("DISABLED"))
    .peek(menuResponse -> menuResponse.setTitle("Under Maintenance"))
    .collect(Collectors.toList());

带有map()函数:

data.stream()
    .filter(menu -> menu.getType().equalsIgnoreCase("DISABLED"))
    .map(menuResponse -> {
        menuResponse.setTitle("Under Maintenance");
        return menuResponse;
    })
    .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    效率不高(因为整个列表都已排序),而且看起来很奇怪,但它没有循环和流:)

        // 1. Let's sort list by type, ascending.
        Collections.sort(data, new Comparator<MenuResponse>(){
            @Override
            public int compare(MenuResponse o1, MenuResponse o2) {
                return o1.getType().compareTo(o2.getType());
            }
        });        
        // DISABLED
        // OK
        // OK
    
        // 2. Let's update title of DISABLED element
        if (data.size()>0 && data.get(0).getType().equalsIgnoreCase("DISABLED")) {
            data.get(0).setTitle("Under Maintenance");
        }
    

    【讨论】:

    • 为什么你把循环放在那里,我的问题是没有任何循环......
    【解决方案3】:

    实现它的一种方法是仅基于type 覆盖MenuResponse 中的equals()(建议同时覆盖hashCode()),如下所示:

    @Override
    public int hashCode() {
        return Objects.hash(type);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        MenuResponse other = (MenuResponse) obj;
        return Objects.equals(type, other.type);
    }
    

    然后,您可以删除类型为DISABLED 的对象的第一次出现,如下所示:

    MenuResponse o = new MenuResponse();
    o.setType("DISABLED");
    int index = data.indexOf(o);
    if (index != -1) {
        data.remove(index);
    }
    

    【讨论】:

    • 我不想删除它,我想更新标题...请看我的 sn-p cmets
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2021-08-27
    • 2020-01-18
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多