java8-科里化与设计模式

科里化

常用于单位转换:
科里化是一种将具备2个参数(比如,x和y)的函数f转化为使用一个参数的函数g,并且这个函数的返回值也是一个函数,它会作为新函数的一个参数。后者的返回值和初始函数的返回值相同,即f(x,y)=(g(x))(y)。

    static double converter(double x, double conversionFactor, double baseline) {
        return x * conversionFactor + baseline;
    }

    static DoubleUnaryOperator curriedConverter(double y, double z) {
        return (double x) -> x * y + z;
    }

    double waterBoilingPointInF = converter(100, 9.0 / 5, 32);
    System.out.println(waterBoilingPointInF);

    DoubleUnaryOperator convertCtoF = curriedConverter(9.0 / 5, 32);//摄氏转为华氏温度
    DoubleUnaryOperator convertUSDtoGBP = curriedConverter(0.6, 0);//美元到人民币
    DoubleUnaryOperator convertKmtoMi = curriedConverter(0.6214, 0);//公里到英里

    System.out.println(convertCtoF.applyAsDouble(100.0));
    System.out.println(convertUSDtoGBP.applyAsDouble(100.0));
    System.out.println(convertUSDtoGBP.applyAsDouble(200.0));

调试

java8中涉及到lambda表达式的栈跟踪不那么友好,较难理解。
调试时可以使用日志调试。

       Stream.of(2, 3, 4, 5)
                .peek(x -> System.out.println("taking from stream: " + x))
                .map(x -> x + 17)
                .peek(x -> System.out.println("after map: " + x))
                .filter(x -> x % 2 == 0)
                .peek(x -> System.out.println("after filter: " + x))
                .limit(3)
                .peek(x -> System.out.println("after limit: " + x))
                .collect(toList());

设计模式

策略模式:

public class StrategyMain {

    public static void main(String[] args) {
        // old school
        Validator v1 = new Validator(new IsNumeric());
        System.out.println(v1.validate("aaaa"));
        Validator v2 = new Validator(new IsAllLowerCase ());
        System.out.println(v2.validate("bbbb"));


        // with lambdas
        Validator v3 = new Validator((String s) -> s.matches("\\d+"));
        System.out.println(v3.validate("aaaa"));
        Validator v4 = new Validator((String s) -> s.matches("[a-z]+"));
        System.out.println(v4.validate("bbbb"));
    }

    interface ValidationStrategy {
        public boolean execute(String s);
    }

    static private class IsAllLowerCase implements ValidationStrategy {
        public boolean execute(String s){
            return s.matches("[a-z]+");
        }
    }
    static private class IsNumeric implements ValidationStrategy {
        public boolean execute(String s){
            return s.matches("\\d+");
        }
    }

    static private class Validator{
        private final ValidationStrategy strategy;
        public Validator(ValidationStrategy v){
            this.strategy = v;
        }
        public boolean validate(String s){
            return strategy.execute(s); }
    }
}


参考

Java 8新特性终极指南 - ImportNew

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,752评论 0 38
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,008评论 0 2
  • <引自微信公众号《书虫小小钢》> 我真的很不行的,这些年唯一有所进步的就是认知上的逐渐完整。 我的大学过得很水的,...
    王平钢阅读 3,043评论 0 1
  • 有欢笑,也有哭泣,人生本是一段戏。 这本《乘风破浪》电影记录书,在看这部电影之前就下单了,因对电影超...
    不要自找麻烦阅读 2,953评论 1 0
  • ‘’玻璃海棠‘’ 2017.6.10 海棠,玉堂富贵。种目多,花色艳,花期长、享有‘国艳’之美誉!在我们西...
    晶紫樱阅读 4,284评论 0 1

友情链接更多精彩内容