• therealsonofsun
    2019-09-25
    老师,用Lambda方式读取文件那里有一点挺困惑的,为什么forEach那里会是System.out(OutputStream类型)呢?前面通过InputStreamReader将文件中的数据按照指定的编码转成了字符或者字符集之类的,再通过BufferedReader读取,所以forEach那里应该是字符类型之类的才对呀(结果理解的不是这样,打脸了),还望老师指正。
    代码如下:
    reader.lines().map(String :: trim).map(String :: toUpperCase).forEach(System.out :: println);

    作者回复:
    Lambda的思维模式确实是有点不一样的。它是以数据的转换为基础的。之前的模式下,参数是数据,也就是“操作(数据)”。Lambda的情况下,参数是操作,也就是“数据(操作)”。正好相反。

    比如说,之前是System.out.println(strData)。Lambda的情况下就是dataList.foreach(System.out :: println),括号里是操作。(而实际上在Java里,这个foreach也是变成了一个循环的)。

    对于你的困惑。首先,“为什么forEach那里会是System.out(OutputStream类型)呢?”foreach里并不是一个OutputStream类型,而是System.out这个兑现的println方法。也就是说,System.out这个对象的println方法就是操作, 是想对list里每个元素执行的操作。

    祝你速速顿悟Lambda大法的奥义。

    
     3
  • 消融
    2019-08-20
    FileInputStream fis = new FileInputStream(sourceFile);

                // TODO 用 InputStreamReader 将这个byte 流套一下,装饰一下,并指定字符编码,让它能够将读出的byte转为字符

                InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

                // TODO 增加缓存功能,输入输出效率更高,并且可以一次读取一行

                BufferedReader reader = new BufferedReader(isr);
     FileInputStream 返回的-1到BufferedReader怎么变成null的啊
    展开

    作者回复:
                    if (nextChar >= nChars) { /* EOF */
                        if (s != null && s.length() > 0)
                            return s.toString();
                        else
                            return null; <---
                    }

    
    
  • 消融
    2019-08-19
    -1是怎么变成null的啊

    作者回复:
    无代码,不问题。

    
    
我们在线,来聊聊吧