一、API
1、基本概念
英文全称Application Programming Interface,翻译为“应用程序编程接口”。 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
2、接口interface
3、格式Format
4、协议Protocol
协议是规定了各部分之间如何进行交流的一系列规则的集合。各部分之间想要完成交互就必须理解并且遵守同一个协议
5、API端点
在同一个接口中提供特定功能子集的服务提供者。不同的端点可以有不同的协议和不同的格式。
6、分页pagination
可以节省带宽和服务器资源,因为你不需要一次获取数据集中的所有内容
7、过滤filtering
总结起来:接口是不同组件进行交互的地方。协议是一系列规定了他们之间怎样进行交互的规则。格式定义了他们通过什么进行交流(JSON或者是XML),端点可以在同一个接口里面提供不同的功能。
特点:
API能够确认所有的操作都是合法的
在发生错误的时候,API会根据错误报告机制发出指示,减轻开发人员的负担
API中内置授权和访问控制,以确保只有授权人员才能访问特定的数据
API实施速率限制来控制服务器资源的使用,以确保用户不会滥用服务
二、Stream
1、基本概念
Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,
开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的
Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用
户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字
母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比
流水从面前流过,一去不复返。
而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方
式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不
同的线程中处理,然后将结果一起输出。
Stream和Collection的区别主要有:
1.stream本身并不存储数据,数据是存储在对应的collection里,或者在需要的时候才生成的;
2.stream不会修改数据源,总是返回新的stream;
3.stream的操作是懒执行(lazy)的:仅当最终的结果需要的时候才会执行
2、Lambda表达式
lambda的语法介绍
在Java语言中引入了一个操作符**“->”**,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:
左侧:指定了Lambda表达式需要的所有参数
右侧:制定了Lambda体,即Lambda表达式要执行的功能。
lambda的特点
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
Lambda表达式的参数列表的数据类型可以省略不写,因为JVM可以通过上下文推断出数据类型,即“类型推断”。
类型推断:在执行javac编译程序时,JVM根据程序的上下文推断出了参数的类型。Lambda表达式依赖于上下文环境。
3、构建stream方法
1、计算集合里空字符串的数量(filter)
@Test
public void test01() {
List<String> list = Arrays.asList("aa", "aae", "bb", "cc", "", "dd");
// 计算空字符串的数量
long count = list.stream().filter(a -> a.isEmpty()).count();
System.out.println("空字符串的数量是>>>" + count + "个");
}
空字符串的数量是>>>1
2、 找出集合中长度为2的字符串数量(filter)
@Test
public void test02() {
List<String> list = Arrays.asList("aa", "aae", "bb", "cc", "", "dd");
// 计算列表中指定长度的字符串
long count1 = list.stream().filter(a -> a.length() == 2).count();
System.out.println("字符串长度为2的数量是>>>" + count1 + "个");
}
字符串长度为2的是>>>4
3、将集合中的空字符串删除(filter)
@Test
public void test03() {
List<String> list = Arrays.asList("aa", "aae", "bb", "cc", "", "dd");
// 删除空的字符串
List<String> collect = list.stream().filter(a -> !a.isEmpty()).collect(Collectors.toList());
System.out.println("筛选后的字符串是>>>" + collect);
}
筛选后的字符串是>>>[aa, aae, bb, cc, dd]
4、合并字符串并用逗号隔开,删除集合中的空字符串(filter)
@Test
public void test04() {
List<String> list = Arrays.asList("aa", "aae", "bb", "cc", "", "dd");
String collect2 = list.stream().filter(a -> !a.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并后的字符串>>>" + collect2);
}
合并后的字符串>>>aa, aae, bb, cc, dd
5、计算集合中元素的平方(map)
@Test
public void test05() {
// 创建一个集合
List<Integer> list1 = Arrays.asList(2, 3, 4, 8, 7, 15);
// 计算列表中元素的平方
List<Integer> collect1 = list1.stream().map(i -> i * i).distinct().collect(Collectors.toList());
System.out.println("列表中元素的平方是" + collect1);
}
列表中元素的平方是[4, 9, 16, 64, 49, 225]
6、用不同的方法进行计算
@Test
public void test06() {
// 创建一个集合
List<Integer> list1 = Arrays.asList(2, 3, 4, 8, 7, 15);
System.out.println("集合中的元素是" + list1);
System.out.println("集合中最大的数是" + statistics.getMax());
System.out.println("集合中最小的数是" + statistics.getMin());
System.out.println("集合中求和" + statistics.getSum());
}
集合中的元素是[2, 3, 4, 8, 7, 15]
集合中最大的数是15
集合中最小的数是2
集合中求和39
7、对集合中重复的数据进行去重(distinct)
@Test
public void distinctStream() {
// 创建一个字符串的集合
Stream<String> distinctStream = Stream.of("bj","shanghai","tianjin","bj","shanghai").distinct();
Stream<String> sortedStream = distinctStream.sorted(Comparator.comparing(String::length));
sortedStream.forEach(x -> System.out.print(x + " "));
}
bj tianjin shanghai
8、把0-9的偶数挑出来,每个偶数乘以2,在将结果相加
@Test
public void test07() {
Stream<Integer> stream = Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Integer integer = stream.filter(num -> num % 2 == 0).map(num -> num * 2).reduce((num1, num2) -> {
return num1 + num2;
}).get();
System.out.println("最后的值是>>>" + integer);
}
}
最后的值是>>>40
三、数学类Math
Math类是 final 修饰的不允许继承。
1、求最大值和最小值
@Test
public void test01(){
// 求两个整数最大值max
System.out.println(Math.max(10,20));
// 求两个整数的最小值min
System.out.println(Math.min(10,20));
}
20
10
2、ceil向上取整,返回浮点型数据
不管小数点后面的数是多少,都会向上取整
@Test
public void test02(){
double a1 = 3.15;
double b1 = 3.85;
// ceil向上取整,返回浮点型数据
System.out.println(Math.ceil(a1));
System.out.println(Math.ceil(b1));
}
4.0</