美文网首页java8的世界
java8 in action:第二章学习,行为参数化

java8 in action:第二章学习,行为参数化

作者: 墙角的牵牛花 | 来源:发表于2017-06-17 10:20 被阅读34次

之前在第一章中提到了谓词(predicate),第一章超链接,今天继续进行扩展。第一章中找指定重量的苹果或者指定颜色的苹果写了好几个方法,本章将这些方法合并到一个去,毕竟这都是苹果的属性。
先写一个接口:

public interface ApplePredicate {
boolean test (Apple apple);
}

实现接口:找出大于100g的苹果:

public class AppleSelfPredicate implements ApplePredicate{

@Override
public boolean test(Apple apple) {
    return apple.getWeight()>100;
}

}

做一下简单的测试。

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 static void main(String[] args) {

    List<Apple> inventory=Arrays.asList(new Apple(10,"red"),
            new Apple(100,"green"),
            new Apple(200,"red"));
    
    List<Apple>  heavyApples=filterApples(inventory,new AppleSelfPredicate());
    System.out.println(heavyApples);
}

如果要查询颜色为红色大于100g的苹果,只需要改变AppleSelfPredicate 类中的test方法即可。

return apple.getWeight()>100 && "red".equals(apple.getColor());

好了。filterApples方法中ApplePredicate p就是行为参数化的用法。当然,匿名类依旧起作用:

List<Apple> redApples=filterApples(inventory, new ApplePredicate() {
        
        @Override
        public boolean test(Apple apple) {
            return "red".equals(apple.getColor());
        }
    });

使用Lambda表达式,改进上面的查询方法,这时候需要将List抽象化。

    public static <T> List<T> filter(List<T> list,Predicate<T> p){
    List<T> result=new ArrayList<>();
    for (T t : list) {
        if (p.test(t)) {
            result.add(t);
        }
    }
    return result;
}

这样就可以直接调用了:

 List<Apple> redApples2=filter(inventory, (Apple a) -> "red".equals(a.getColor()));
        
     System.out.println("redApples2:"+redApples2);  
    
     List numbers=new ArrayList<>();
     for (int j = 0; j < 10; j++) {
        numbers.add(j);
     }
    
     List<Integer> eventNumbers=filter(numbers, (Integer i) -> i%2 ==0);
     System.out.println(eventNumbers);

最后说一下,Lamdba简写Runnable。

   Thread t=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("hi");
        }
    });

简写成:

Thread thread=new Thread(() ->  System.out.println("hi")    );

好了,今天就是这样了。下一章要老老实实地学Lambda表达式了。

相关文章

  • java8 in action行为参数化

    行为参数化:拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这...

  • 行为参数化------Java8 in action

    行为参数化是一种类似于策略设计模式的模式,可以轻松地适应不断变化的需求。 具体而言:行为参数化就是让一个方法接受多...

  • java8 in action:第二章学习,行为参数化

    之前在第一章中提到了谓词(predicate),第一章超链接,今天继续进行扩展。第一章中找指定重量的苹果或者指定颜...

  • 2018-09-25

    java学习笔记(三) 简单的讲讲行为参数化传递代码,这也是Java8实战的第二章 应对不断变化的需求 在软件工程...

  • Lambda表达式知识手册

    1.行为参数化 行为参数化是将方法的具体实现抽象化,java8之前可以使用接口(策略模式,根据不同需求需要编写...

  • java8学习:行为参数化

    将“行为“作为参数,传进函数,然后去执行 直接上例子 目标:获取所有颜色为绿色的苹果 对象:苹果列表 行为:筛选出...

  • java8之行为参数化,你用了吗?

    java8之行为参数化,你用了吗? java8新增加了方法引用::语法(将方法作为参数)。将方法的引用传递进去,可...

  • Java8 学习笔记

    @(in action系列)[java8, lambda, stream] Java8 学习 java8 能高效的...

  • 【Java8】Java8实战之行为参数化与Lambda

    Java8实战之行为参数化与Lambda 前言 现在Java的迭代速度比以前快了很多,然而,本渣渣最近才开始学习J...

  • 【Java8】Java8实战之Stream

    Java8实战之Stream 前言 在前面一个小节中,我们已经学习了行为参数化以及Lambda表达式,通过Lamb...

网友评论

    本文标题:java8 in action:第二章学习,行为参数化

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