[Java8]Java8 lambda表达式学习

2017-04-13  本文已影响139人  骊骅

0x00 例子

1、 用lambda表达式实现Runnable

import java.util.Arrays;

/**
 * Created by haicheng.lhc on 10/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/10
 */
public class Test {
    public static void main(String[] args) {
//        java8之前
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Before Java8, too much code for too little to do");
            }
        }).start();
//      java8之后
        new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
    }
}

输出结果:

2、使用lambda表达式对列表进行迭代

import java.util.Arrays;
import java.util.List;

/**
 * Created by haicheng.lhc on 10/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/10
 */
public class Test {
    public static void main(String[] args) {

        // Java 8之前:
        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        for (String feature : features) {
            System.out.println(feature);
        }

        // Java 8之后:
        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        features.forEach(n -> System.out.println(n));

        // 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
        features.forEach(System.out::println);
    }
}

3、使用lambda表达式和函数式接口Predicate

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * Created by haicheng.lhc on 13/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/13
 */
public class TT {

    public static void main(String args[]) {
        List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");

        System.out.println("Languages which starts with J :");
        filter(languages, (str) -> str.startsWith("J"));

        System.out.println("Languages which ends with a ");
        filter(languages, (str) -> str.endsWith("a"));

        System.out.println("Print all languages :");
        filter(languages, (str) -> true);

        System.out.println("Print no language : ");
        filter(languages, (str) -> false);

        System.out.println("Print language whose length greater than 4:");
        filter(languages, (str) -> str.length() > 4);
    }

    public static void filter(List<String> names, Predicate<String> condition) {
        for (String name : names) {
            if (condition.test(name)) {
                System.out.println(name + " ");
            }
        }
    }
}

其中的filter可以实现的更加优雅

  public static void filter(List<String> names, Predicate<String> condition) {
        names.stream().filter((name) -> (condition.test(name))).forEach((name) -> {
            System.out.println(name + " ");
        });
    }

4、通过过滤创建一个String列表

过滤是Java开发者在大规模集合上的一个常用操作,而现在使用lambda表达式和流API过滤大规模数据集合是惊人的简单。流提供了一个 filter() 方法,接受一个 Predicate 对象,即可以传入一个lambda表达式作为过滤逻辑。下面的例子是用lambda表达式过滤Java集合,将帮助理解

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by haicheng.lhc on 13/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/13
 */
public class T2 {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList("Java", "Scala", "C", "Haskell", "Lisp");
        // 创建一个字符串列表,每个字符串长度大于2
        List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
        System.out.printf("Original List : %s %n filtered list : %s %n", strList, filtered);
    }
}


0x01 lambda表达式语法

(params) -> expression
(params) -> statement
(params) -> { statements }

如果只有一个参数,可以不写()

0x02 lambda表达式和要点

list.forEach(n -> System.out.println(n)); 
list.forEach(System.out::println);  // 使用方法引用

若对参数有任何修改,则不能使用方法引用,而需键入完整地lambda表达式,如下所示:

list.forEach((String s) -> System.out.println("*" + s + "*"));
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by haicheng.lhc on 13/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/13
 */
public class T2 {
    public static void main(String[] args) {
        List<Integer> primes = Arrays.asList(new Integer[]{2, 3,5,7});
        int factor = 2;
        primes.forEach(element -> { factor++; });
    }
}

0x03 函数式开发

0x04 函数接口

package java.lang;

/**
 *
 * @author  Arthur van Hoff
 * @see     java.lang.Thread
 * @see     java.util.concurrent.Callable
 * @since   JDK1.0
 */
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}
上一篇 下一篇

猜你喜欢

热点阅读