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());
}
}
Java8 lambda表达式10个示例
最新推荐文章于 2024-06-24 22:38:52 发布