Java8 lambda表达式10个示例

package lambdaExpre;

import org.junit.Test;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * lambda 表达式看10
 * 网址  http://www.importnew.com/16436.html
 */
public class LambdaTest10 {
    public static void  main(String[] args){

      /*  //案例1 线程开起
        new Thread(){
            @Override
            public void run(){
                //业务逻辑
                System.out.println("老版本线程开起");
            }
        }.start();

        //java8 线程开起
        new Thread(()->
                //业务逻辑
                System.out.println("java8 线程开起")
        ).start();*/
/*
      //案例2 swing 事件监听
        JButton jButton= new JButton("show");
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("老版本事件监听");
            }
        });


        //java 8 事件监听
        jButton.addActionListener((e)->System.out.println("java 8事件监听"));*/

/*        //案例3 使用lambda表达式对列表进行迭代

        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        for(String feature : features){
            System.out.println(feature);
        }
            //JAVA8 循环输出
        features.forEach(s -> System.out.println(s));*/

/*        //案例4 lambda 使用lambda表达式和函数式接口Predicate  支持函数式编程。 取值的时候需要变换相应 类型((String)str)
        List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
        System.out.println("Languages which starts with J :");
//        String st = "asddd";
//        System.out.println(st.startsWith("as"));
        filter(languages, (str)->((String)str).startsWith("J"));

        System.out.println("Languages which ends with a ");
        filter(languages, (str)->((String)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)->((String)str).length() > 4);
    }

    public static void filter(List<String> names, Predicate condition){
//        for(String name :names){
//            if(condition.test(name)){
//                System.out.println(name+"满足条件");
//            }
//        }
        //变形 流食编程
        //names.stream().filter((name)->(condition.test(name))).forEach((name) -> System.out.println(name + "满足条件"));
        //思路  列表 变成流 使用API 用函数式过滤 ,流式输出
        names.stream().filter((name) ->(condition.test(name))).forEach((name)->System.out.println(name+"满足条件"));*/
    }

    //如何在lambda表达式中加入Predicate
    @Test
    public void anli5(){
        List<String> names = Arrays.asList("jJava11", "Scala", "C++", "Haskell", "Lisp");
        Predicate<String> startsWithJ = (n)->(((String)n).startsWith("j"));
        Predicate<String> fourLetterLong = (n) -> ((String)n).length()>4;
        //支持多個 函数表达式
      /*  names.stream()
                .filter(startsWithJ.and(fourLetterLong))
                .forEach((n) -> System.out.print("nName, which starts with 'J' and four letter long is : " + n));*/
      names.stream().filter(startsWithJ.or(fourLetterLong)).forEach((n)->System.out.println("nName, which starts with 'J' or four letter long is : "+n));
    }

    //Java 8中使用lambda表达式的Map和Reduce示例  mapreduce 映射关系
    @Test
    public void anli6(){
        // 不使用lambda表达式为每个订单加上12%的税
        List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
        for (Integer cost : costBeforeTax) {
            double price = cost + .12*cost;
            System.out.println(price);
        }

        //JAVA 8 使用map为每个加12的税
        costBeforeTax.stream().map((cost)->cost+ .12*cost).forEach(System.out::println);
        costBeforeTax.stream().map((cost)->cost+ 0.12*cost).forEach((cost)->System.out.println(cost));
    }

    @Test
    public void anli6_2(){
        // 为每个订单加上12%的税
        // 老方法:
        List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
        double total = 0;
        for (Integer cost : costBeforeTax) {
            double price = cost + .12*cost;
            total = total + price;
        }
        System.out.println("Total : " + total);
        //java 8 map 后 reduce
        double bill = (double)costBeforeTax.stream().map((cost)->(double)cost + 0.12*(double)cost).reduce((sum,cost)->(double)sum+(double)cost).get();
        System.out.println(bill);
    }

    @Test //通过过滤创建一个String列表
    public void anli7(){
        List<String> strList = Arrays.asList(  "abc","" ,"bcd", "", "defg", "jk");

        // 创建一个字符串列表,每个字符串长度大于2
        //创建一个新的字符列表
        // List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());

        List<String> filtered = strList.stream().filter(x ->x.length()>2).collect(Collectors.toList());
        System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);
    }

    @Test //例8、对列表的每个元素应用函数
    public void anli8(){
/*        我们通常需要对列表的每个元素使用某个函数,例如逐一乘以某个数、除以某个数或者做其它操作。这些操作都很适合用 map() 方法,
        可以将转换逻辑以lambda表达式的形式放在 map() 方法里,就可以对集合的各个元素进行转换了,如下所示。*/

        // 将字符串换成大写并用逗号链接起来
        List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
//        String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));

        String G7Countries="";
        G7Countries = G7.stream().map(x->x.toUpperCase()).collect(Collectors.joining(","));
        System.out.println(G7Countries);
    }
    @Test //例9、复制不同的值,创建一个子列表
    public void anli9(){
/*       本例展示了如何利用流的 distinct() 方法来对集合进行去重。*/

        // 用所有不同的数字创建一个正方形列表
        List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
        //List<Integer> distinct = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

        List<Integer> distinct = numbers.stream().distinct().map(i->i*i).collect(Collectors.toList());
        System.out.printf("Original List : %s,  Square Without duplicates : %s %n", numbers, distinct);


    }

    @Test //例10、计算集合元素的最大值、最小值、总和以及平均值
    public void anli10(){
        /*    IntStream、LongStream 和 DoubleStream 等流的类中,有个非常有用的方法叫做 summaryStatistics() 。
        可以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各种摘要数据。
        在本例中,我们用这个方法来计算列表的最大值和最小值。它也有 getSum() 和 getAverage() 方法来获得列表的所有元素的总和及平均值。。*/
//获取数字的个数、最小值、最大值、总和以及平均值
        List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
//        IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
        IntSummaryStatistics stats = primes.stream().mapToInt(x->x).summaryStatistics();
        System.out.println("Highest prime number in List : " + stats.getMax());
        System.out.println("Lowest prime number in List : " + stats.getMin());
        System.out.println("Sum of all prime numbers : " + stats.getSum());
        System.out.println("Average of all prime numbers : " + stats.getAverage());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值