Jdk 1.8 新特性

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
后面用到继续更新,如有错误,欢迎下面留言指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值