Java8 lambda表达式及新特新

分享自:Vincent

package info.liuwenjun.test;

import org.junit.Test;

import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;

/**
 * Created by Vincent on 2016-04-12.
 */
public class TestJava8 {

    private void print(Object obj) {
        System.out.println(obj);
    }

    @Test
    public void sort() {
        List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

        Collections.sort(names, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return a.compareTo(b);
            }
        });

        Collections.sort(names, (String a, String b) -> {
            return a.compareTo(b);
        });

        Collections.sort(names, (String a, String b) -> a.compareTo(b));

        Collections.sort(names, (a, b) -> a.compareTo(b));

        print(names);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("inner class");
            }
        }).start();

        new Thread(() -> System.out.println("lambda")).start();
    }

    @Test
    public void typeDeduction() {
        Function<Integer, String> intToStr = a -> a.toString();

        Function<Double, String> doubleToStr = a -> a.toString();

        // doubleToStr = intToStr;

        // () -> print("typeDeduction");
        ((Action) () -> print("typeDeduction")).action();
    }

    @FunctionalInterface
    private interface Action {
        void action();
    }

    @Test
    public void functionalInterface() {
        Function<Integer, Integer> plusOne = i -> i + 1;
        print(plusOne.apply(1));

        Predicate<Character> emoticon = o->‘皿‘<-o;
        print(emoticon.test(‘皿‘));

        Consumer<Integer> printInt = i -> print(i);
        printInt.accept(1);

        Supplier<Long> getCurrentTime = () -> System.currentTimeMillis();
        print(getCurrentTime.get());

        Action sayHello = () -> print("hello");
        sayHello.action();
    }

    @Test
    public void testThis() {
        Action innerClass = new Action() {
            @Override
            public void action() {
                this.print("testThis");
            }

            private void print(Object obj) {
                System.out.println("Inner: " + obj);
            }
        };
        innerClass.action();

        Action lambda = () -> this.print("testThis");
        lambda.action();
    }

    @Test
    public void testFinal() {
        final int finalVar = 0;
        int effectivelyFinalVar = 0;
        // effectivelyFinalVar = 1;

        new Action() {
            @Override
            public void action() {
                print(finalVar);
                print(effectivelyFinalVar);
            }
        }.action();
    }

    private List<String> stringCollection = new ArrayList<String>() {
        {
            add("ddd2");
            add("aaa2");
            add("bbb1");
            add("aaa1");
            add("bbb3");
            add("ccc");
            add("bbb2");
            add("ddd1");
        }
    };

    @Test
    public void filter() {
        stringCollection
                .stream()
                .filter(s -> s.startsWith("a"))
                .forEach(s -> print(s));
    }

    @Test
    public void sorted() {
        stringCollection
                .stream()
                .sorted((a, b) -> b.compareTo(a))
                .filter(s -> s.startsWith("a"))
                .forEach(s -> print(s));
    }

    @Test
    public void map() {
        stringCollection
                .stream()
                .map(s -> s.toUpperCase())
                .sorted(Comparator.comparing(s -> s.length()))
                .forEach(s -> print(s));
    }

    @Test
    public void flatMap() {
        stringCollection
                .stream()
                .filter(s -> s.startsWith("a"))
                .flatMap(s -> Arrays.stream(s.split("")))
                .forEach(c -> print(c));
    }

    @Test
    public void match() {
        print(stringCollection.stream().anyMatch(s -> s.startsWith("a")));

        print(stringCollection.stream().allMatch(s -> s.startsWith("a")));

        print(stringCollection.stream().noneMatch(s -> s.startsWith("z")));
    }

    @Test
    public void count() {
        print(stringCollection.stream().filter(s -> s.startsWith("b")).count());
    }

    @Test
    public void reduce() {
        Optional<Integer> optional = stringCollection
                .stream()
                .map(s -> s.length())
                .reduce((a, b) -> a + b);
        print(optional.get());

        int sum = stringCollection.get(0).length();
        for (int i = 1; i < stringCollection.size(); i++) {
            sum = sum + stringCollection.get(i).length();
        }
        print(sum);
    }

    @Test
    public void intStream() {
        IntSummaryStatistics statistics = stringCollection
                .stream()
                .mapToInt(s -> s.length())
                .summaryStatistics();
        print(statistics.getAverage());
        print(statistics.getSum());
        print(statistics.getMax());
        print(statistics.getMin());
        print(statistics.getCount());
    }

    @Test
    public void complex() {
        stringCollection
                .stream()
                .sorted()
                .filter(s -> s.startsWith("a") && s.endsWith("1"))
                .map(s -> s.length())
                .filter(i -> i == 4)
                .forEach(i -> print(i));
    }

    @Test
    public void toList() {
        List<Integer> len = stringCollection.stream().map(s -> s.length()).collect(Collectors.toList());
        print(len);
    }

    @Test
    public void toMap() {
        Map<String, Integer> len = stringCollection.stream().collect(Collectors.toMap(s -> s, s -> s.length()));
        print(len);
    }

    @Test
    public void groupingBy() {
        Map<Integer, List<String>> groups = stringCollection
                .stream()
                .collect(Collectors.groupingBy(s -> s.length()));
        print(groups);
    }

    @Test
    public void complexCollect() {
        Map<Integer, List<String>> groups = stringCollection
                .stream()
                .collect(Collectors.groupingBy(s -> s.length(),
                        Collectors.mapping(s -> s.toUpperCase(), Collectors.toList())));
        print(groups);
    }

    @Test
    public void removeIf() {
        List<String> copy = new ArrayList<>(stringCollection);

        stringCollection.removeIf(s -> s.startsWith("a"));
        print(stringCollection);

        Iterator<String> iter = copy.iterator();
        while (iter.hasNext()) {
            if(iter.next().startsWith("a")) {
                iter.remove();
            }
        }
        print(copy);
    }

    @Test
    public void iterateMap() {
        Map<String, Integer> map = stringCollection.stream().collect(Collectors.toMap(s -> s, s -> s.length()));

        map.forEach((key, value) -> print(key + ": " + value));

        print("---------");

        for(Map.Entry entry : map.entrySet()) {
            print(entry.getKey() + ": " + entry.getValue());
        }
    }

    @Test
    public void mapStream() {
        Map<String, Integer> map = stringCollection.stream().collect(Collectors.toMap(s -> s, s -> s.length()));

        map.entrySet()
                .stream()
                .filter(e -> e.getValue() == 4)
                .forEach(e -> print(e.getKey() + ": " + e.getValue()));
    }
}
时间: 2024-08-27 11:14:25

Java8 lambda表达式及新特新的相关文章

深入学习Java8 Lambda表达式 -- 从函数式接口说起

希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论.FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那么它就是一个FI.为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解.举个简单的例子,Runnable接口就是一个FI,下面是它的源

Java8 Lambda表达式深入学习(2) -- InvokeDynamic指令详解

为了更好的支持动态类型语言,Java7通过JSR292给JVM增加了一条新的字节码指令:invokedynamic.之后,JVM上面的一些动态类型语言,比如Groovy(2.0+)和JRuby(1.7.0+)都开始支持invokedynamic.不过让人意外的是,为动态语言量身定制的invokedynamic指令,居然也被用到了Java8的Lambda表达式(JSR335)实现上.本文会对invokedynamic(以下简写做indy)指令做出详细解释. 测试代码 Java7以及更早版本的Jav

Java8 Lambda表达式应用案例 -- 单线程游戏服务器+异步数据库操作

前段时间我们游戏服务器的开发环境升级到了Java8,这两天我又把服务器的线程模型重新设计了一下,用上了Lambda表达式.Lambda表达式确实能够大幅简化Java代码,特别是丑陋不堪的匿名内部类,这篇文章主要就是想和大家分享这一点. 线程模型 首先简单介绍一下我们游戏服务器的线程模型,大致如下图所示: Netty线程池只处理消息的收发,当Netty收到消息之后,会交给游戏逻辑线程处理.由于是单线程在处理游戏逻辑,所以每一个消息必须很快处理完,也就是说,不能有数据库等耗时操作,不然逻辑线程很可能

Java8 Lambda表达式详解手册及实例

先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下Java8的新特性.Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了. 现在进入正题Java8的Lambda,首先看一下发音 ([?l?md?])表达式.注意该词的发音,b是不发音的,da发[d?]音. 为什么要引入Lambda表达式 简单的来说,引入La

Java8 Lambda表达式深入学习(4) -- Java8实现方式

前几篇文章讨论了函数式接口和Lambda表达式语法.invokedynamic指令,以及Groovy2如何利用indy指令.本篇文章在前面几篇的基础之上,简要介绍Java8底层是如何实现Lambda表达式的. 示例代码 本文将以下面的代码为例展开讨论: import java.util.Arrays; import java.util.List; public class LambdaImplTest { public static void main(String[] args) { m1(A

java8 lambda表达式初接触

环境是jdk8 代码如下: package memTest; /** * Created by PC on 2014/8/5. */ public class LambdaOne { public static void test(){ new Thread(()-> System.out.print("hi") ).start(); } public static void main(String[] args) { new LambdaOne().test(); } } ja

JAVA8 Lambda表达式完全解析

JAVA8 新特性 在学习JAVA8 Lambda之前,必须先了解一下JAVA8中与Lambda相关的新特性,不然对于一些概念会感到比较陌生. 1. 接口的默认方法和静态方法 Java 8允许我们给接口添加一个默认方法,用default修饰即可.默认方法可以重写,也可以不用重写.这就是和抽象方法的区别,在用法上,没有其他区别. public interface IMyInterface { void onMethond(String str);//这是一个抽象方法 default String

Java8 Lambda表达式介绍

欢迎进入我的博客:blog.scarlettbai.com查看更多文章 Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍. Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲,但是习惯之后,其确实有助于代码的简洁,且在Python.swift等中都有类似于Lambda这

【Java学习笔记之三十一】详解Java8 lambda表达式

Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码.而定义行为最重要的那行代码,却混在中间不够突出.Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码.这样有时可读性更好,表达更清晰.在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步.将进一步促进并行

spark2.x由浅入深深到底系列六之RDD 支持java8 lambda表达式

学习spark任何技术之前,请正确理解spark,可以参考:正确理解spark 我们在 http://7639240.blog.51cto.com/7629240/1966131 中已经知道了,一个scala函数其实就是java中的一个接口,对于java8 lambda而言,也是一样,一个lambda表达式就是java中的一个接口.接下来我们先看看spark中最简单的wordcount这个例子,分别用java8的非lambda以及lambda来实现: 一.非lambda实现的java spark