廖雪峰Java16函数式编程-2Stream-4map】的更多相关文章

1. 函数式编程 Java有2类方法: 实例方法:通过实例调用 静态方法:通过类名调用 Java的方法相当于过程式语言的函数 函数式编程(Functional Programing): 把函数作为基本运算单元 函数可以作为变量,传递给另一个函数 函数可以接收函数 函数可以返回函数 历史研究函数式编程的理论是Lambda演算,所以把支持函数式编程的风格成为Lambda表达式 2. Java的单方法接口 在Java中,有许多接口只定义了1个方法: Comparator Runnable Callab…
1. 排序 Stream<T> sorted(); //按元素默认大小排序(必须实现Comparable接口) Stream<T> sorted(Comparator<? super T> cp); //按指定Comparator比较的结果排序 public static void main(String[] args){ Stream<String> s = Stream.of("hello","JAVA",&quo…
1. 聚合方法 Stream.reduce()是一个Stream的聚合方法:把一个Stream的所有元素聚合成一个结果 例如: Stream.of(1, 2, 3, 4, 5).count(); //返回元素个数:5 2. reduce简介 reduce接收的对象是BinaryOperator接口,其定义了一个apply方法,负责把上次累加的结果和本次元素进行运算,并且返回累加的结果 Optional<T> reduce(BinaryOperator<T> accumulator)…
1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过滤掉,剩下的元素构成了一个新的Stream 例如对{1, 2, 3, 4, 5}调用filter,传入的测试函数是f(x)=x%2,结果为1,就通过:否则不通过. 实现filter的代码 Stream<Integer> s = Stream.of(1, 2, 3, 4, 5); Stream<…
1. map()简介 Stream.map()是一个Stream的转换方法,把一个stream转换为另一个Stream,这2个Stream是按照映射函数一一对应的. 所谓map操作,就是把一种操作运算映射到序列的每个元素上. 例如:f(x)=x^2,对x计算它的平方,把这个函数映射到一个序列{1, 2, 3, 4, 5},就得到另一个序列{1, 4, 9, 16, 25}.这2个Stream是按照映射函数一一对应的 Stream<Integer> s = Stream.of(1, 2, 3,…
1. 方法1:把一个现有的序列变为Stream,它的元素是固定的 //1.直接通过Stream.of()静态方法传入可变参数进行创建 Stream<Integer> s = Stream.of(1,2,3,4,5); //2.Arrays.stream(数组)把一个数组变为Stream Stream<Integer> s = Arrays.stream(theArray); //3.通过Collections的stream()方法,把任意的Collections(例如List,Se…
1. Stream Java8引入全新的Stream API 位于java.util.stream包 1.1 Stream API不同于java.io的InputStream/OutputStream java.io java.util.stream 存储 顺序读写的byte/char 顺序输出的任一Java对象 用途 序列化数据至文件/网络 内存计算/业务逻辑 1.2 Stream和List也是不同的 List元素已经分配并存储在内存中的,而Stream输出的元素并没有预先存储在内存中,它通常…
Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法签名和接口恰好一致,可以直接传入方法引用,格式:类名::方法名 静态方法引用 在SortedBy这个类中定义了一个静态方法,其方法签名是传入2个String,返回int. class SortedBy{ static int nameIgnoreCase(String s1, String s2){…
函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 def add(x, y, f): return f(x) + f(y) x ==> -5 y ==> 6 f ==> abs f(x) + f(y) ==> abs(-5) + abs(6) ==> 11 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就…
1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 * Socket.getInputStream():从TCP连接读取数据 提供额外附加功能的FilterInputStream * 如果要给FileInputStream添加缓冲功能: BufferedFileInputStream extends FileInputStream * 如果要给Fi…
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract void run(); } public class Student extends Person{ @Override public void run(){} } public class Teacher extends Person{ @Override public void run(){}…
每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法: 抽象方法用abstract修饰 抽象方法没有任何执行语句 因为无法执行抽象方法,因此这个类也必须声明为抽象类abstract class 无法实例化一个抽象类.如果子类不是抽象类,依旧可以被实例化. 抽象类作用: 抽象类用于被继承 抽象类可以强迫子类实…
1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通过继承,可以实现代码的复用. 继承使用关键字extends,一个类只能有一个父类. 如果没有写明继承类,编译器会自动指定该类继承于基类Object. Person:超类super,父类,基类 Student:子类subclass,扩展类 Person.java //默认继承Object public…
1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Person() 小明 实例/ming Person ming = new Person() 小红 示例/hong Person hong = new Persion() 小军 示例/jun Person jun = new Persion() 书 类/class class Book() Java核心…
1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络. Socket/TCP/部分IP都是由操作系统提供的.不同的编程语言只是提供了对操作系统调用的加单封装,例如Java提供的几个Socket相关的类就封装了操作系统提供的接口. 为什么需要Socket? 因为仅仅通过IP地址进行通信还不够,同一台计算机同一时间会运行多个网络程序.当计算机收…
1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr,9090);//并不建立连接 //接收 byte[] data=...; DatagramPacket packet = new DatagramPacket(data, data.length); sock.send(packet); //发送 byte[] buffer = new byte[…
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通常使用一个无限for循环,在这个for循环内部,每次调用accept方法,返回一个与远程客户新建的Socket连接,紧接着启动一个新的线程,来处理这个连接. ServerSocket ss = new ServerSocket(port); for( ; ; ){ Socket sock = ss.…
使用Future可以获得异步执行结果 Future<String> future = executor.submit(task); String result = future.get(); 但是当我们使用get()获得异步执行结果的时候,这个方法可能会阻塞.我们通过while循环反复调用isDone()来判断异步结果是否已经完成. while(!future.isDone()){ Thread.sleep(1); } String result = future.get() 所以使用Futu…
Atomic java.util.concurrent.atomic提供了一组原子类型操作: 如AtomicInteger提供了 int addAndGet(int delta) int incrementAndGet() int get() int compareAndGet() Atomic类可以实现: 无锁(lock-free)实现的线程安全(thread-safe)访问 原理:CAS(Compare and Set)如果AtomicInteger实例的值是prev,就替换为next,返回…
Concurrent 用ReentrantLock+Condition实现Blocking Queue. Blocking Queue:当一个线程调用getTask()时,该方法内部可能让给线程进入等待状态,直到条件满足.线程唤醒以后,getTask()才会返回,而java.util.concurrent提供了线程安全的Blocking集合,如ArrayBlockingQueue. class TaskQueue{ final Queue<String> queue = new LinkedL…
1.线程锁可以嵌套 在多线程编程中,要执行synchronized块: 必须首先获得指定对象的锁 Java的线程锁是可重入的锁.对同一个对象,同一个线程,可以多次获取他的锁,即同一把锁可以嵌套.如以下代码 public void add(int m){ synchronized (lock){ this.value += m; another(m); } } public void addAnother(int m){ synchronized (lock){ this.another += m…
多任务 现代操作系统(windows,MacOS,Linux)都可以执行多任务: 多任务就是同时运行多个任务,例如同时开启钉钉.百度网盘.火狐.谷歌.ps等 操作系统执行多任务就是让多个任务交替执行,例如浏览器执行0.001秒,网盘执行0.001秒,钉钉执行0.001秒.因为任务的数量远远多余CPU的数量,因此任务也是交替执行的 进程.线程 进程(Process):一个任务就是一个进程. 线程(Thread):某些进程内部还需要同时执行多个子任务.例如word打字.拼写检查.打印等 进程和线程的…
1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):void write(int b) 写入字符(0-65535):void write(int c) 写入字节数组 void write(byte[] b) 写入字符数组void wirlte(char[] c) void write(byte[] b, int off, int len) void w…
1.java.io.Reader和java.io.InputStream的区别 InputStream Reader 字节流,以byte为单位 字符流,以char为单位 读取字节(-1,0-255):int read() 读取字符,(-1,0-65535):int read() 读到字节数组:int read(byte[] b) 读到字符数组:int read(char[] c) int read(byte[] b, int off, int len) int read(char[] c, in…
1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializable接口: * Serializable接口没有定义任何方法 * 空接口被称为标记接口(Marker Interface) ObjectOutputStream负责把一个Java对象写入二进制流: try(ObjectOutputStream output = new ObjectOutputS…
1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linux:/User/admin/conf/default.properties //先获取getClass(),再通过getResourceAsStream可以获取任意的资源文件 try(InputStream input = getClass().getResourceAsStream("/defau…
1.ZipInputStream是一种FilterInputStream 可以直接读取zip的内容 InputStream->FilterInputStream->InflateInputStream->ZipInputStream->JarInputStream JarInputStream使用ZipInputStream派生出来的,可以直接读取jar文件的MANIFEST.MF文件 ZipInputStream的基本用法: try(ZipInputStream zip = ne…
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数.Math.ceil(4.5)//5.0 3 floor() 返回小于等于(<=)给定参数的最大整数 .ath.floor(4.5)//4.0 4 rint() 以0.5为界返回与参数最接近的整数.返回类型为double.Math.rint(4.5)//4.0 Math.rint(4.51)//5.0…
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON = 1; public static final int TUE = 2; public static final int WED = 3; public static final int THU = 4; public static final int FRI = 5; public stati…
1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { private String name; private int age; private boolean child; public String getName() { return name; } public void setName(String name) { this.name = nam…