有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中组合两种类似的方法?

我有两种方法,它们的条件不同。那么,我如何将两种方法结合成一种呢

private void filterById(String keyW) {
    neModel.setRowCount(0);
    for (int i = neList.size() - 1; i > -1; i--) {
        //CONDITION:
        if (String.valueOf(neList.get(i).getId()).toLowerCase().contains(keyW.toLowerCase())) {
            Object[] aRow = createARow(i);
            neModel.addRow(aRow);
        }
    }
}

private void filterByTitle(String keyW) {
    neModel.setRowCount(0);
    for (int i = neList.size() - 1; i > -1; i--) {
        //CONDITION:
        if (neList.get(i).getTitle().toLowerCase().contains(keyW.toLowerCase())) {
            Object[] aRow = createARow(i);
            neModel.addRow(aRow);
        }
    }
}

*“neList”是“新闻”的列表 类“News”具有以下属性:id、标题、文本等


共 (4) 个答案

  1. # 1 楼答案

    在Java8+中,您可以尝试使用功能接口,并将差异作为一种策略进行传递

    类似这样的东西(未经测试,因为我没有编译器):

    private void filter(String keyW, Function<News, String> propertyExtractor) {
      neModel.setRowCount(0);
    
      //note that this could probably be replaced by for(News news : newList)
      //but in that case you'd either have to change createARow to not need the index or increment the index in the loop body
      for (int i = neList.size() - 1; i > -1; i--) {        
        if (propertyExtractor.apply(neList.get(i)).toLowerCase().contains(keyW.toLowerCase())) {
            Object[] aRow = createARow(i);
            neModel.addRow(aRow);
        }
      }
    }
    
    //Examples of how to use it, you don't have to keep those (delegating) methods
    private void filterById(String keyW) { 
      filter( keyW, e -> String.valueOf(e.getId()));
    }
    
    private void filterByTitle(String keyW) { 
      filter( keyW, News::getTitle);
      //or: filter( keyW, e -> e.getTitle());
    }
    

    或者,在提供整个条件的Predicate<T>中使用Function<T, S>过程来代替if(predicate.test(neList.get(i))) { ... }

    编辑:根据OP的评论,将T替换为News

  2. # 2 楼答案

    在相同的if中,可以在条件之间放置| |(或)运算符

    如果索引冲突,则多使用一个索引变量进行管理

  3. # 3 楼答案

    public void filterBy(String keyW, Function<Data, String> function) {
        String key = keyW.toLowerCase();
        neModel.setRowCount(0);
    
        IntStream.range(0, neList.size())
                 .mapToObj(i -> function.apply(neList.get(neList.size() - i - 1)).toLowerCase().contains(key) ? createARow(i) : null)
                 .filter(Objects::nonNull)
                 .forEach(row -> neModel.addRow(row));
    }
    
  4. # 4 楼答案

    如果不想使用函数参数,只需创建一个方法,其中包含一个与所需过程相对应的额外参数
    这个额外的参数可以是枚举,或者如果只有两种情况1布尔标志

    private void filterBy(boolean byId, String keyW) {
        neModel.setRowCount(0);
        for (int i = neList.size() - 1; i > -1; i--) {
            String what = byId ? String.valueOf(neList.get(i).getId()) : neList.get(i).getTitle();
    
            if (what.toLowerCase().contains(keyW.toLowerCase())) {
                Object[] aRow = createARow(i);
                neModel.addRow(aRow);
            }
        }
    }
    

    现在这样称呼它:

    filterBy(true, yourkey) // instead of filterById(yourkey)
    

    或者

    filterBy(false, yourkey) // instead of filterByTitle(yourkey)