Java 8实战之读书笔记二:基础知识

本文深入探讨了Java8带来的重大革新,重点介绍了流(Streams)API如何简化集合处理及利用多核的优势。此外,还详细讲解了Lambda表达式、方法引用及函数式接口的概念和应用场景。

好记性不如烂笔头,整理一些个人觉得比较重要的东西。

一、基础知识

第1章 为什么要关心Java 8

Java 8提供了一个新的API(称为“流”, Stream),它支持许多处理数据的并行操作,其思路
和在数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”(在这里
是Streams库)来选择最佳低级执行机制。

Java 8中加入Streams可以看作把另外两项扩充加入Java 8的直接原因:

    (1).把代码传递给方法的简洁方式(方法引用、 Lambda)

    (2).接口中的默认方法。

Java 8也用Stream API(java.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。

Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。

用行为参数化把代码传递给方法:

    行为参数化:实现了把方法(你的代码)作为参数传递给另一个方法的能力。

把函数作为一等值。

第2章 通过行为参数化传递代码

示例:

public static boolean isGreenApple(Apple apple) {
    return "green".equals(apple.getColor());
}

//java.util.function中有这个接口
public interface Predicate<T> {
    boolean test(T t);
}

static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple: inventory){
        if (p.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}

//使用时:
filterApples(inventory, Apple::isGreenApple);

以下是你应从本章中学到的关键概念。
     行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们, 完成不同行为的能力。
     行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
     传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java 8之前可以用匿名类来减少。
     Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。

第3章 Lambda 表达式

161931_zou2_3290751.png

函数式接口:只定义了一个抽象方法

@FunctionalInterface:用于表示该接口会设计成一个函数式接口。

//无装箱操作(推荐)
IntPredicate evenNumbers = (int i) -> i % 2 == 0;
evenNumbers.test(1000);

//装箱
Predicate<Integer> oddNumbers = (Integer i) -> i % 2 == 1;
oddNumbers.test(1000);

162603_vQvG_3290751.png

162636_eTcY_3290751.png

162709_9Mhi_3290751.png

162829_jaxC_3290751.png

复合Lambda表达式的有用方法:

比较器复合:Comparator.comparing

    .reversed()逆序,.thenComparing比较器链

谓词复合:negate()非,and,or

函数复合:.andThen(Function fun),.compose(Function fun)两者顺序相反

 

以下是你应从本章中学到的关键概念。
     Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表。
     Lambda表达式让你可以简洁地传递代码。
     函数式接口就是仅仅声明了一个抽象方法的接口。
     只有在接受函数式接口的地方才可以使用Lambda表达式。
     Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。
     Java 8自带一些常用的函数式接口,放在java.util.function包里,包括Predicate<T>、 Function<T,R>、 Supplier<T>、 Consumer<T>和BinaryOperator<T>,如表3-2所述。
     为了避免装箱操作,对Predicate<T>和Function<T, R>等通用函数式接口的原始类型
特化: IntPredicate、 IntToLongFunction等。

     环绕执行模式(即在方法所必需的代码中间,你需要执行点儿什么操作,比如资源分配和清理)可以配合Lambda提高灵活性和可重用性。
     Lambda表达式所需要代表的类型称为目标类型。
     方法引用让你重复使用现有的方法实现并直接传递它们。
     Comparator、 Predicate和Function等函数式接口都有几个可以用来结合Lambda表达式的默认方法。

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值