美文网首页
java8-科里化与设计模式

java8-科里化与设计模式

作者: lesline | 来源:发表于2018-10-14 23:40 被阅读5次

科里化

常用于单位转换:
科里化是一种将具备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

相关文章

  • java8-科里化与设计模式

    科里化 常用于单位转换:科里化是一种将具备2个参数(比如,x和y)的函数f转化为使用一个参数的函数g,并且这个函数...

  • JS设计模式

    Javascript的设计模式 设计模式基本可以分为三组模式:创建型模式:设计对象的创建与初始化结构型模式:描述了...

  • 交互设计分析——虾米音乐1

    产品:虾米音乐 1.导航与层级标签的一体化设计 虾米音乐的导航设计模式采取了非标准化的IOS设计模式。 直接把我的...

  • python自动化笔试面试题(附带答案)

    一、问答题 1、自动化代码中,用到了哪些设计模式? 答:自动化代码用到过的设计模式: ①单例设计模式 ②工厂模式 ...

  • JavaScript

    JavaScript高级函数 惰性函数 函数柯里化 级联函数(链式函数) 设计模式 单例模式 构造函数模式 工厂模...

  • 浅谈JS的一些设计模式

    @(书籍阅读)[JavaScript, 设计模式] 常见设计模式 设计模式简介 设计模式概念解读 设计模式的发展与...

  • php设计模式之桥接模式

    桥接模式 把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之...

  • 组件化的几个方案对比

    组件化(一) CTMediator 设计模式:中介(Mediator)模式 + Target-Action模式 ...

  • 23种常用设计模式

    基础知识 设计模式概述 从招式与内功谈起——设计模式概述(一):设计模式从何而来? 从招式与内功谈起——设计模式概...

  • 23种常用设计模式

    基础知识 设计模式概述 从招式与内功谈起——设计模式概述(一):设计模式从何而来? 从招式与内功谈起——设计模式概...

网友评论

      本文标题:java8-科里化与设计模式

      本文链接:https://www.haomeiwen.com/subject/ngkxzftx.html