JDK1.8新特性介绍
下面记录下个人在使用Lambda 表达式上面的一些使用技巧,欢迎大家留言
1、Lambda 语法
引用静态方法 [类名::static方法]
引用某个对象的方法 [实例化对象::普通方法]
引用特定类型的方法 [特定类::方法]
1.1、常见的stream流
//创建一个空的stream
Stream<Integer> stream = Stream.empty();
List<String> strs = Arrays.asList("11212","dfd","2323","dfhgf");
//创建普通流
Stream<String> stream = strs.stream();
//创建并行流
Stream<String> stream1 = strs.parallelStream();
//创建无限流,通过limit提取指定大小
Stream.generate(()->"number"+new Random().nextInt()).limit(100).forEach(System.out::println);
//创建规律的无限流
Stream.iterate(0,x->x).limit(10).forEach(System.out::println);与如下代码意思是一样的
//合并流可以把两个stream合并成一个stream(合并的stream类型必须相同)
Stream<String> stream1 = Stream.of(arr1);
Stream<String> stream2 = Stream.of(arr2);
Stream.concat(stream1,stream2).distinct().forEach(System.out::println);
map //转换流,将一种类型的流转换为另外一种流
filter //过滤流,过滤流中的元素
flapMap //拆解流,将流中每一个元素拆解成一个流(多个 Stream 合并成一个 Stream 并返回)
List<String>li=Arrays.asList("a","b","c");
List<String>li2=Arrays.asList("b","d","g");
li.stream().flatMap(x->li2.stream()).forEach(x->System.out.println(x));//#将两个for循环变成一条语句
String[] strs = {"java8","c++","name","age"};
Arrays.stream(strs)
.map(str -> str.split("")) // 映射成为Stream<String[]>
.flatMap(Arrays::stream) // 扁平化为Stream<String>
.distinct()
.forEach(System.out::println);
sorted 对流进行排序
skip 跳过前n个数据
count 计算数量
findAny 找到所有匹配的元素 对并行流十分有效 只要在任何片段发现了第一个匹配元素就会结束整个运算
findFirst 查找第一个
anyMatch 是否含有匹配元素
Boolean aBoolean = Stream.of(arr).anyMatch(x->x.startsWith("a"));
2、Map 的使用
Map<String, Integer> items = new HashMap<>();
items.put("ABC", 100);
①:普通方法:
for (Map.Entry<String, Integer> entry : items.entrySet()) {
System.out.println("Key: " + entry.getKey() + " Value: " + entry.getValue());
}
②:新特性
第一种简写式:
items.forEach((k,v)->System.out.println("Key: " + k + " Value: " + v));
第二种判断式:
items.forEach((k,v)->{
System.out.println("Key: " + k + " Value: " + v);
if("ABC".equals(k)){
System.out.println(k);
}
});
3、 关于List类型的遍历
List<String> list= new ArrayList<>();
或
/* List<String> list= Lists.newArrayList();*/两种写法都可以
list.add("ABC");
1.List也有两种写法
①:
list.forEach(item->System.out.println(item));
②:
list.forEach(System.out::println);
});
// Java 8之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
System.out.println(feature);
}
// Java 8之后:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
features.forEach(System.out::println);
通过过滤创建一个String列表
List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
// 将字符串换成大写并用逗号链接起来
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));
System.out.println(G7Countries);
// 用所有不同的数字创建一个正方形列表
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());
System.out.printf("Original List : %s, Square Without duplicates : %s %n", numbers, distinct);
//获取数字的个数、最小值、最大值、总和以及平均值
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
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());
4、Optional类
一:作用
解决空指针异常导致Java应用程序失败的问题
二:方法
Optional.of() 不允许参数是null,为空抛出异常
Optional.ofNullable() 无限制
4.1、常见方法
isPresent()://判断值是否存在
void ifPresent(Consumer<? super T> consumer)
//如果值存在则使用该值调用 consumer , 否则不做任何事情。
orElse(value)://如果optional对象保存的值不是null,则返回原来的值,否则返回value
orElseGet(Supplier supplier)://功能与orElse一样,只不过orElseGet参数是一个对象
filter(Predicate)://判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。
map(Function)://对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
4.2、Optional用法
optional.ifPresent() //可以判断返回值是否为空
optional.get() //获取返回值
ifPresent(Consumer<? super T> consumer) //在结果不为空时进行消费操作,如下实例
//List<String> list = null;
//Optional.ofNullable(list).ifPresent(System.out::println);
// 用Optional可以在没有值时指定一个返回值
Integer[] arr = new Integer[]{4,5,6,7,8,9};
Integer result = Stream.of(arr).filter(x->x>9).max(Comparator.naturalOrder()).orElse(-1);
Integer result1 = Stream.of(arr).filter(x->x>9).max(Comparator.naturalOrder()).orElseGet(()->-1);
Integer result2=Stream.of(arr).filter(x->x>9).max(Comparator.naturalOrder()).orElseThrow(RuntimeException::new);
Optional.empty()//创建一个空的Optional
Optional.of()//创建指定值的Optional
//map方法进行Optional的转换
Optional<Student> studentOptional = Optional.of(new Student("user1",21));
Optional<String> optionalStr = studentOptional.map(Student::getName);
flatMap//方法进行Optional的迭代
Optional.of(参数).flatMap(Class::方法一).flatMap(Class::方法二);
后面还有 Stream 分组 ,Optional用法,lambda 收集器等可以查看
更详细可以去fchen521.top 搜索Lambda表达式查看
网络不好可以访问https://fchen521.gitee.io
另外附上JDK1.8中文文档
http://download.csdn.net/download/qq_36611929/10224238
后面用到继续更新,如有错误,欢迎下面留言指正