语言GitHub 上幽默的门类引进

更新于 2016/08/23

函数式接口使用背景

咱俩了解,java是均等派系面向对象编程语言,java中一切都是面向对象的(除了原有数据类型)。在java中函数(方法)是类似/对象的等同组成部分,不能够独立在。而别一些函数式编程语言如C++、Javascript等语言,可以编写单独的函数并可直接调用它们。

面向对象并非不好,只是有时用编制冗长的代码。举个简单的例证,我们用创造一个Runnable实例,通常咱们会采用匿名内部类如下:

Runnable r = new Runnable(){
            @Override
            public void run() {
                System.out.println("My Runnable");
            }};

实在以即时段代码中,真实发生因此底仅仅只是内部的run方法,其他的代码只是java面向对象要求的。

java8部数式接口及lambda表达式可以于我们编辑少量代码就能达成上述功效。

资源

  • Open Source Society
    University
    自学电脑对的上路径和资源。
  • 免费的微处理器编程类中文图书
  • 免费编程书
  • 处理器科学论文
  • awesome
    各种壮烈的资源。
  • Python
    Share
    Python初家书籍、视频、资料、社区推荐。
  • Python
    资料汇集
  • 码农周刊整理
  • 500 Lines or
    Less
    一些赛质量之代码总数小于 500 行的稍品种
  • 前端
    • Github FE
      project
      Github 上值得关注的前端项目
    • node.js中文资料导航
    • AngularJS
      学习
      一些 AngularJS 的博客,文章,视频,书籍等。
    • es6-cheatsheet
      ES6 的有 tips,小技巧,最佳实践等。
    • 腾讯移动Web前端知识库
    • iconpark
      字体图标汇总
    • 前端技能培训
      朴灵出品。
    • 前者工具推荐
      一要命波前端工具。
    • Leetcode Solutions with
      JavaScript
      技术面试题库网站:leetcode
      OJ
      上的问题解答。
    • 前者常用插件汇总
    • 自的前端笔记

java8函数式接口

在java8中,自我才生一个抽象方法的接口即可称之为函数式接口,可以使@FunctionalInterface诠释显示标明接口是函数式接口。这个注解并非必须的,如果长欠注解,则接口若有多于一个的虚幻方法虽然会提示编译错误。

java8套数式接口的尽深补是可运用lambda表达式来初始化函数式接口从而避免匿名内部类样式的笨重写法。

java8的集合API已经重复写了,并且引进了运用过多底函数式接口的初的流式API。在java.util.function包下定义了众函数式接口如:ConsumerSupplierFunctionPredicate

教程

  • 雨痕的编程语言学习笔记
    包括 C,Python 和 Go。
  • Git
    教程
    中文的啊~
  • git-recipes
    高质量之Git中文课,来自海外社区的好文章与私家执行。
  • HTTP API
    设计指南
  • JSON
    API
    用 JSON 构建 API 的正规指南。
  • s5s5 学习 CSS3
    动画的感受
  • 程序员如何优雅的挣钱零花钱?

lambda表达式

透过lambda表达式我们可以拿函数式编程在java的面向对象中形象化。
目标是java语言的着力,我们无可能离开对象单独去行使方式,这吗是为何java提供lambda表达式仅仅能够运用函数式接口的案由。

若果单纯发生一个华而不实方法,那么用lambda表达式就无见面存在疑惑了。
lambda表达式的签字:
*** (argument1, argument2,…) -> (body) ***

  • ** (argument1, argument2,…)**代表方法签名,argument1,
    argument2,…是参数列表

  • ** -> ** 是箭头,指向方法体

  • **(body) ** 是方法体,可以运用{}包裹代码块来表示

  • 倘是无参方法,则法签名方可采取 ()

  • 只要单出一个参数的说话,()可以简简单单

前方创建Runnable实例的代码可以以lambda表达式实现:

Runnable r1 = () -> System.out.println("My Runnable");

说明下这段代码:

  • Runnable 是一个函数式接口,所以我们得行使lambda表达式创建它的实例

  • 以 run()方法咩有参数,所以我们的lambda表达式也没有参数

  • 即使如if-else语句一样,如果仅仅来一行代码的语我们可省{}符号了。

Web 前端

  • Solved by
    Flexbox
    用Flex实现科普布局。
  • You don’t (may not) need
    Lodash/Underscore
  • You Don’t Need
    JavaScript
    用 CSS 来实现原以为肯定要 JavaScript 的作用。
  • Mock.js
    能 Mock 异步请求与扭转指定条件的自由数据的脚本库。
  • JSON
    Server
    分分钟长一个返JSON格式 REST API 的测试服务器。
  • underscore-1.8.3.js
    源码解读

胡而以lambda表达式

polyfill(兼容浏览器API的shim)

  • box-sizing-polyfill
    让ie6/7支持 CSS box-sizing: border-box
  • Respond
    让浏览器支持 CSS3: min/max-width
  • flexibility
    Flexbox 的 polyfill。
  • REM unit
    polyfill
    REM 的 polyfill。

调减代码量

运匿名内部类与lambda表达式的代码量区分已经死强烈了

CSS 效果

  • superscrollorama
    视觉差效果。
  • impress.js
    各种表现的法力,用来开幻灯片不错。
  • fullPage
    全屏翻页的js组件,用来举行幻灯片不错。

支持连地、并行地执行

lambda的另外一个好处就是咱们得利用流式API连续并行地实行顺序。
为证实这点,我们举个例子。判断一个频是勿是质数:
顿时段代码不是极优质的,但是好达标目的:

private static boolean isPrime(int number) {        
    if(number < 2) return false;
    for(int i=2; i<number; i++){
        if(number % i == 0) return false;
    }
    return true;
}

化解者问题的代码是连接的,如果给定的数字格外充分之言语老耗时。另外一个弱点是分返回太多可读性不好。使用lambda和流式API的写法:

private static boolean isPrime(int number) {        
    return number > 1
            && IntStream.range(2, number).noneMatch(
                    index -> number % index == 0);
}

**IntStream
**举凡一个本来排好序的因素也原始类型int的支持连并行执行的流动。为了重新好读书,代码可以更优化为:

private static boolean isPrime(int number) {
    IntPredicate isDivisible = index -> number % index == 0;

    return number > 1
            && IntStream.range(2, number).noneMatch(
                    isDivisible);
}

range(arg1,arg2)办法返回一个**IntStream
**含arg1,但是非带有arg2的增幅为1的班。

noneMatch()返回是否没元素匹配不达标加的预定义条件Predicate。

测试

  • testem
    让写js的单元测试变得有趣
  • dalekjs
    跨浏览器测试js工具
  • nightwatchui
    测试框架
  • Hardy
    CSS 测试

深受艺术传递行为action

咱得对一个list中满足某个条件的素进行求和。

public static int sumWithCondition(List<Integer> numbers, Predicate<Integer> predicate) {
        return numbers.parallelStream()
                .filter(predicate)
                .mapToInt(i -> i)
                .sum();
    }

运方式如下:

//对所有元素求和
sumWithCondition(numbers, n -> true)
//对是偶数的元素求和
sumWithCondition(numbers, i -> i%2==0)
//对所有大于5的元素求和
sumWithCondition(numbers, i -> i>5)

安全

  • domxssscanner
    DOM based XSS扫描工具。
  • jsprime
    检测JS代码的安全性的工具。

高效率的懒加载

比方我们得寻找有3-11间的最好酷的奇数,并请来它的平方。

我们兴许采取这样的代码:

private static int findSquareOfMaxOdd(List<Integer> numbers) {
        int max = 0;
        for (int i : numbers) {
            if (i % 2 != 0 && i > 3 && i < 11 && i > max) {
                max = i;
            }
        }
        return max * max;
    }

上述代码是在一个队中拍卖我们好用流式API代替:

public static int findSquareOfMaxOdd(List<Integer> numbers) {
        return numbers.stream()
                .filter(NumberTest::isOdd)  
                .filter(NumberTest::isGreaterThan3)
                .filter(NumberTest::isLessThan11)
                .max(Comparator.naturalOrder())
                .map(i -> i * i)
                .get();
    }

    public static boolean isOdd(int i) {
        return i % 2 != 0;
    }

    public static boolean isGreaterThan3(int i){
        return i > 3;
    }

    public static boolean isLessThan11(int i){
        return i < 11;
    }

冒号表达式是艺术的援,NumberTest::isOdd 是 (i) -> isOdd(i) 或者
i -> NumberTest.isOdd (i) 的缩写。

异常死的种类

  • node-webkit
  • opal 将 ruby
    代码转化成为 Javascript
  • popularconvention
    github上项目之代码风格的统计,效果看
    这里
  • framer
    用js来打原型图。支持3d效果啊~

复多的lambda表达式示例

() -> {}                     // 无参无方法体

() -> 42                     // 无参有方法体
() -> null                   // 无参有方法体
() -> { return 42; }         // 无参,代码块中返回结果
() -> { System.gc(); }       // 

// 复杂的代码块
() -> {
  if (true) return 10;
  else {
    int result = 15;
    for (int i = 1; i < 10; i++)
      result *= i;
    return result;
  }
}                          

(int x) -> x+1             // 单个的声明类型的参数
(int x) -> { return x+1; } // 
(x) -> x+1                 // 单个参数,单条代码同上
x -> x+1                   // 同上

(String s) -> s.length()   // 
(Thread t) -> { t.start(); } // 
s -> s.length()              // 单个的编译器可以推断的类型参数
t -> { t.start(); }          // 单个的编译器可以推断的类型参数

(int x, int y) -> x+y      // 多个的声明类型的参数
(x,y) -> x+y               // 多个的可以推断的类型参数
(x, final y) -> x+y        // 错误。不能修改final变量y
(x, int y) -> x+y          // 错误,无法推断混合类型

Mac & iOS

  • 强迫症的 Mac
    设置指南
  • macOS & iOS app
    推荐

道、构造器引用

java8可以应用冒号表达式来引用方法:

System::getProperty
System.out::println
"abc"::length
ArrayList::new
int[]::new

其他

  • pyjokes
    程序员的讥笑。
  • 不等语言类之gitignore模板
  • Sublime的片段常用Snippets

自身 Github 上之具有
Star

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图