Java 8: 行为参数

出于特殊的原因,Android中引入Java 8在好像是Android N版本,这距离Java 8的发布已经很久了。这导致我几乎已经忘记可以在Android中使用Java 8语法,直到我在Android源码中看到各种Lambda表达式,我才意识到我需要清晰的掌握Java 8语法。

本篇文章主要简单地讨论我运用Java 8的行为参数来改进项目的过程,从中可以体会到Java 8语法威力。

在项目中,有的地方需要需要读取文件的一行,我会在一个工具类中写出这样一个方法

    public static String readOneLine(File file) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            return br.readLine();
        }
    }

看起来确实很简洁了。然而项目中还有另外一个需求,只读取第二行,因此我还得写一个方法,如下

    public static String readSecondLine(File file) throws IOException{
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            br.readLine();
            return br.readLine();
        }
    }

当写到这里时,我就意识到我似乎在做重复的工作。这两个方法不同的地方在于读取文件内容方式,一个是只需要读取第一行,一个是只需要读取第二行。我可以对读取的行为进行抽象,让这两个方法合并为一个方法。

我把这个读取的行为抽象为如下接口

public interface ReaderProcessor {
    String read(BufferedReader bufferedReader) throws IOException;
}

那么上面的两个方法就可以合并为一个方法

    public static String read(File file, ReaderProcessor processor) throws IOException{
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            return processor.read(br);
        }
    }

那么现在读取一行,可以这么做

        try {
            String firstLine = FileUtils.read(new File("hello.txt"), new ReaderProcessor() {
                @Override
                public String read(BufferedReader bufferedReader) throws IOException {
                    return bufferedReader.readLine();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

如果再用Lambda表达式和方法引用,就可以改写如下

        try {
            String firstLine = FileUtils.read(new File("hello.txt"), BufferedReader::readLine);
        } catch (IOException e) {
            e.printStackTrace();
        }

这样看起来相当简洁。那么如果只需要读取第二行,代码如下

        try {
            String secondLine = FileUtils.read(new File("hello.txt"), bufferedReader -> {
                bufferedReader.readLine();
                return bufferedReader.readLine();
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

这种利用行为抽象进行改进的方法,可以应对读取文件的各种要求,而且利用Java 8和Lambda表达式,甚至是方法引用,可以让语法更简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值