如何消除java中的重复代码,不使用lambda表达式和函数接口

_冬木 2017-05-24 11:48:55

import java.util.*;
import java.io.*;

public class FileMatcher {
public File[] filesHere = (new java.io.File(".")).listFiles();


public File[] filesEnding(String query) {
List<File> list = new ArrayList<>();
for (File file: filesHere)
if (file.getName().endsWith(query))
list.add(file);
File[] fileArray = new File[list.size()];
for(int i = 0; i < list.size(); i++) {
fileArray[i] = list.get(i);
}
return fileArray;
}

public File[] filesContaining(String query) {
List<File> list = new ArrayList<>();
for (File file: filesHere)
if (file.getName().contains(query))
list.add(file);
File[] fileArray = new File[list.size()];
for(int i = 0; i < list.size(); i++) {
fileArray[i] = list.get(i);
}
return fileArray;
}

public File[] filesRegex(String query) {
List<File> list = new ArrayList<>();
for (File file: filesHere)
if (file.getName().matches(query))
list.add(file);
File[] fileArray = new File[list.size()];
for(int i = 0; i < list.size(); i++) {
fileArray[i] = list.get(i);
}
return fileArray;
}




3个方法中只有if条件语句中使用的方法是不一样的,其余都是重复的,如果抽象出一个通用方法,这3个方法调用这个通用方法。使用接口或者匿名内部类该怎么做?
...全文
205 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
a350062174 2017-05-24
  • 打赏
  • 举报
回复


public File[] filesHere = (new java.io.File(".")).listFiles();
    interface Apply {
        public boolean apply(String filename, String query);
    }
    public File[] filter(String query, Apply a) {
        List<File> list = new ArrayList<>();
        for (File file : filesHere)
            if (a.apply(file.getName(), query))
                list.add(file);
        File[] fileArray = new File[list.size()];
        for (int i = 0; i < list.size(); i++) {
            fileArray[i] = list.get(i);
        }
        return fileArray;
    }

    public File[] filesEnding(String query) {
        return filter(query, new Apply() {
            public boolean apply(String filename, String query) {
                return filename.endsWith(query);
            }
        });
    }

    public File[] filesContaining(String query) {
        return filter(query, new Apply() {
            public boolean apply(String filename, String query) {
                return filename.contains(query);
            }
        });
    }

    public File[] filesRegex(String query) {
        return filter(query, new Apply() {
            public boolean apply(String filename, String query) {
                return filename.matches(query);
            }
        });
    }
爱情过夜 2017-05-24
  • 打赏
  • 举报
回复
去看看策略设计模式。 设计模式可以解决你的问题,但是并不是什么时候都要用。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧