Java8 第一章

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8 第一章相关的知识,希望对你有一定的参考价值。

 

流处理:

1.是一系列数据项,一次只生成一项

2.一个程序的输出流很可能是另一个程序的输入流

 

Java8第一个新功能:函数式编程:类名::方法名-->作为参数传递

主旨:把函数(方法和Lambda)作为一等值,执行时在元素之间无互动.

1.方法引用比如筛选一个目录中的所有隐藏的文件.

File类里面有一个isHidden方法 . 我们可以把它当做一个函数,接收一个file , 返回一个布尔值.

public class MethodReferences {
    File[] hiddenFiles =new File(".").listFiles(new FileFilter() {
        @Override
        public boolean accept(File file) {
            return file.isHidden();
        }
    });
}
class MethodReference{
    File[] hiddenFiless = new File(".").listFiles(File::isHidden);
}
 
 
真cool啊,类加方法就可以了,感受到函数编程的快捷!!!!!!
 
其实就是将函数(isHidden)传递给listFiles方法 ,
 java8体现了更广义的将函数作为值的思想,包括lambda或者匿名函数.
把方法作为一等值来传递的程序,
谓词-->在数学上代表一个类似函数的东西,他接收一个参数值,并返回true或false.
java8会将条件代码作为参数传递进去,这样可以避免filter方法出现重复的代码,
 
外部迭代  : 自己去做迭代的过程,用foreach循环一个个去迭代元素,然后处理元素,
内部迭代  : Stream API
小知识:
计算集群的概念 : 用告诉网络连接起来的多台计算机来高效的处理海量数据.java8 提供了新的编程风格,可以更好的利用这样的计算机,具体怎么更好利用暂时还不清楚.....
这个时候查了一下搜索引擎的实现,比如说google搜索,大概了解了一下实现,知乎地址: https://www.zhihu.com/question/19937854
Collection主要用来存储和访问数据,Stream主要用于对数据的计算.
Stream允许并提倡并行处理一个Stream中的元素,
流中的并行,首先库会将大的流分成几个小的流,以便并行处理,其次流提供的这个几乎免费的并行,在有可变的共享变量情况下,只有在传递给filter之类的库的方法不会互动时才能工作.
 
行为参数化(接口的多重实现)
应对不断变化的需求 : 一个良好的原则是在编写类似的代码之后,将其抽象化 .反例 : 苹果农民不断变化的需求
比如先定义一个标准的接口
//策略模式实例
public interface ApplePredicate{
    boolean test (Apple apple);
}
public class AppleHeavyWeightPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return apple.getWeight() > 150;
    }
}
public class AppleGreenColorPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return "green".equals(apple.getColor);
    }
}
//传递代码行为(比如通过传递不同的对象就可以调用不同实现方法,完成对应的操作)
//这个时候农名如果有其他的需求只需要创建一个类实现ApplePredicate就可以了
public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory) {
        if (p.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}
public class AppleRedAndHeacyPredicate implements ApplePredicate{
    public boolean test (Apple apple){
        return "red".equals(apple.getColor()) && apple.getWeight()>150;
    }
}
List<Apple> redAndHeavyApples = filterApples(inventory,new AppleRedAndHeacyPredicate);
 
 
策略模式:一个类的行为或者其算法在运行时更改.上面属于策略模式==>忘记了就再看看菜鸟教程写的很清晰
 
lambda
 
public interface Predicate<T>{
    boolean test(T t);
}
public static <T> List<T> filter(List<T> list,Predicate<T> p){
    List<T> result = new ArrayList<>();
    for(T e : list){
        if (p.test(e)) {
            result.add(e);
        }
    }
    return result;
}
?
List<Apple> redApples = filter(inventory,(Apple apple)->"red".equals(appl.getColor()));
?
List<Integer> evenNumbers = filter(numbers,(Integer i) -> i % 2 = 0);
 
 
 
Lambda优点:
         匿名==>没有明确的名称,写得少想得多
         函数==>函数不属于一个具体的类,Lambda有参数列表,函数主体,返回类型还可能有抛出异常列表  
         传递==>Lambda表达式可以作为参数传递给方法或存储在变量中        
         简介==>无需像匿名类那样写很多模板代码
             
Lambda的使用:
函数式接口:可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数接口的实例
                    具体来说:是函数式接口一个具体实现的实例,例子如下:
<wiz_code_mirror>
 
 
 
 
 
public static void main(String[] args) {
    Runnable r1 =()-> System.out.println("nihao");
    Runnable r2 = new Runnable() {
        @Override
        public void run() {
            System.out.println("wobuhao");
        }
    };
    r1.run();
    r2.run();
}
?
输出:
nihao
wobuhao

以上是关于Java8 第一章的主要内容,如果未能解决你的问题,请参考以下文章

Java 8实战 (笔记)第一章

自学Java第一章——《Java概述》

Java8

《Java虚拟机精讲》读书笔记-第一章Java体系结构

《第一行代码》第一章

Java8 Stream流