2015-10-20 Java Functional Programming: 伪造闭包工厂,创建域对象

原文链接 作者: Mark Needham

  最近我们想构建一个需要使用外部依赖进行计算的域对象,同时我们希望在测试的时候能够忽略这些依赖。

  最开始,我们简单地在域对象中创建依赖,这使得在测试的过程中,不能随意修改依赖的值。

  同样,由于外部依赖仅仅只是域对象的计算所需,并非定义域对象的可变状态,我们不应该把依赖通过构造函数传入域对象内部。

  最后,我们把域对象定义成内部类,代码如下:

 
public class FooFactory {
    private final RandomService randomService;

    public FooFactory(RandomService randomService) {
        this.randomService = randomService;
    }

    public Foo createFoo(String bar, int baz) {
        return new Foo(bar, baz);
    }

    class Foo {
        private String bar;
        private int baz;

        public Foo(String bar, int baz) {
            this.bar = bar;
            this.baz = baz;
        }

        public int awesomeStuff() {
            int random = randomService.random(bar, baz);
            return random * 3;
        }
    }
}
    

阅读全文

2015-10-19 Java Functional Programming: Java中函数式编程的Map和Fold(Reduce)

原文链接 作者: Cyrille Martraire

  在函数式编程中,Map和Fold是两个非常有用的操作,它们存在于每一个函数式编程语言中。既然Map和Fold操作如此强大和重要,但是Java语言缺乏Map和Fold机制,那么该如何解释我们使用Java完成日常编码工作呢?实际上你已经在Java中利用手动编写循环的方式实现了Map和Fold操作(译者注:许多动态语言如python都提供了内置的实现)。

  免责声明:本篇文章仅仅只是一篇入门简介,并非函数式编程的参考。函数式编程爱好者可能会不赞同本文观点。

#你已经很熟悉Map和Fold

  假设这里有一个List,存储了不含增值税VAT(译者注:Value Added Tax)的金额列表,现在我们想把这个列表转换成包含增值税金额的列表。首先我们定义一个方法,为金额添加增值税:

 
public double addVAT(double amount, double rate) {
    return amount * (1 + rate);
}
    

阅读全文

2015-10-17 函数式编程 Functional Programming

  原文链接

  在Java程序员的世界里,第一要素是“类”,而在函数式编程里,第一要素则是“函数”。完全不同的编程理念,确实很难让函数式编程出现在Java工程师日常工作的代码中。

  先来2篇优秀博文扫盲:

  仔细阅读过上面2篇文章之后,相信你已经对函数式编程有了一定的了解。同时,在许多高级语言(Java、C#等)都陆续加入了函数式编程特性的形势下,不难预测函数式编程将再次成为未来的主流编程模型。

  本系列译文如下:

  1. Functional programming with Map and Fold in Java
  2. Java: Faking a closure with a factory to create a domain object
  3. Functional style in Java with predicates – Part 1
  4. Functional style in Java with predicates – Part 2
  5. Function interface – A functional interface in the java.util.function package in Java 8
  6. Predicate and Consumer Interface in java.util.function package in Java 8
  7. A simple application of Lambda Expressions in Java 8
  8. Template Method Pattern – Using Lambda Expressions, Default Methods
  9. Java 8 lambda walkthrough(此篇文章代码居多,不进行翻译,感兴趣的读者可以点击链接阅读原文章)

阅读全文

2015-10-16 Java IO: 其他字节流(上)

作者: Jakob Jenkov

  本小节会简要概括Java IO中的PushbackInputStream,SequenceInputStream和PrintStream。其中,最常用的是PrintStream,System.out和System.err都是PrintStream类型的变量,请查看Java IO: System.in, System.out, System.err浏览更多关于System.out和System.err的信息。

#PushbackInputStream

  原文链接

  PushbackInputStream用于解析InputStream内的数据。有时候你需要提前知道接下来将要读取到的字节内容,才能判断用何种方式进行数据解析。PushBackInputStream允许你这么做,你可以把读取到的字节重新推回到InputStream中,以便再次通过read()读取。代码如下:

 
PushbackInputStream input = new PushbackInputStream(new FileInputStream("c:\\data\\input.txt"));

int data = input.read();

input.unread(data);
    

  可以通过PushBackInputStream的构造函数设置推回缓冲区的大小,代码如下:

 
PushbackInputStream input = new PushbackInputStream(new FileInputStream("c:\\data\\input.txt"), 8);
    

  这个例子设置了8个字节的缓冲区,意味着你最多可以重新读取8个字节的数据。

阅读全文

2015-10-16 Java IO: 其他字符流(下)

作者: Jakob Jenkov

  本小节会简要概括Java IO中的PushbackReader,LineNumberReader,StreamTokenizer,PrintWriter,StringReader,StringWriter。

#PushbackReader

  原文链接

  PushbackReader与PushbackInputStream类似,唯一不同的是PushbackReader处理字符,PushbackInputStream处理字节。代码如下:

 
PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"));

int data = reader.read();

reader.unread(data);
    

  同样可以设置缓冲区大小,代码如下:

 
PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"), 8);
    

阅读全文