一、Stream流

1、创建

使用Collection接口下的stream方法或parallelStream方法

实现了Collection接口的可用,如List、Vector、Set

1
2
3
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

使用Arrays工具类的stream方法,将数组转成流

1
2
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

使用Stream中的静态方法:of()、iterate()、generate()

1
2
3
4
5
6
7
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10

Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);

2、操作

image-20220119092422055

筛选、切片

1
2
3
4
5
6
7
Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);

Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14 过滤
.distinct() //6 7 9 8 10 12 14 去重
.skip(2) //9 8 10 12 14 跳过n个元素、配合limit实现分页
.limit(2); //9 8 获取n个元素
newStream.forEach(System.out::println);

映射

未完。。。

二、杂记

1、lombok 相关注解

@Accessors

@RequiredArgsConstructor

2、前后端传值

@PathVariable和@RequestParam

@PathVariable用于获取路径参数,@RequestParam用于获取查询参数。

@RequestParam的参数:

value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;

defaultValue:默认值,表示如果请求中没有同名参数时的默认值

1
2
@GetMapping("/user/{userId}/teachers")
public List getTeachers(@PathVariable("userId") Long userId,@RequestParam(value="type",required=false) String type){......}

@RequestBody

用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。

需要注意的是:一个请求方法只可以有一个@RequestBody,但是可以有多个@RequestParam@PathVariable。如果你的方法必须要用两个 @RequestBody来接受数据的话,大概率是你的数据库设计或者系统设计出问题了!

3、spring相关注解

@Validated 校验前端传来的请求数据

@Async 以便异步地调用该方法

4、新建模块404

问题:新建模块里面的接口404

解决:需要把新模块依赖到入口模块的pom.xml里

image-20220125114008941

三、JPA

1、数据基本操作

image-20220119143213034

如图,jpa里面基本的crud接口都有,直接调用即可

2、自定义操作

jpa基本的数据库操作可以满足简单的业务,在复杂的业务下需要自定义操作

(1).@Query()注解

1
2
3
4
5
6
7
8
public interface JpaUserRepository extends JpaRepository<JpaUser, Long>{
//若是增删改,则要声明事务
//@Transactional 一般放在业务层,不是这里
//@Modifying 通知jpa这是增删改操作
//注解里的1是参数索引,在多参数时指明是哪一个
@Query("FROM 类名 where 属性名=?1")
List<User> findUserByName(String name);
}

(2).规定方法名

  • 主题关键字(支持查询、删除)

    image-20220119150335301

  • 修饰符(查询条件)

(3).Query By Example

只支持查询,可用作动态条件查询

3、多表关联操作

配置关联关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@Data
@Entity
@Table(name = "JPA_USER")
public class JpaUser {
@Id
@Column(name = "ID")
// 生成策略
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "JPA_USER_S")
@SequenceGenerator(sequenceName = "JPA_USER_S", name = "JPA_USER_S", allocationSize = 1)
private Long id;

@Column(name = "NAME")
private String name;

/**
* 一对一
* cascade设置关联操作
* 查询 默认支持
* ALL 所有操作都会执行关联操作
* PERSIST 只有插入才会执行关联操作
* MERGE 只有修改才会执行关联操作
* REMOVE 只有删除才会执行关联操作
* fetch设置是否懒加载
* EAGER 立即加载(默认)
* LAZY 懒加载(用到才加载,并且要事务)
* optional限制关联对象不能为null
* true 可以为null(默认)
* false 不能为null
*/
@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY,optional = false)
@Column(name = "xxx")
private Account account;

/**
* 一对多
* cascade设置关联操作
* 查询 默认支持
* ALL 所有操作都会执行关联操作
* PERSIST 只有插入才会执行关联操作
* MERGE 只有修改才会执行关联操作
* REMOVE 只有删除才会执行关联操作
* fetch设置是否懒加载
* EAGER
* LAZY 懒加载(默认,用到才加载,这样确保了性能,并且要事务)
* optional限制关联对象不能为null
* true 可以为null(默认)
* false 不能为null
*/
@OneToMany(cascade = CascadeType.ALL)
@Column(name = "xxx")
private List<Course> course;
}

(1)一对一

@OneToOne(cascade=CascadeType.ALL)

括号里可设置指定的关联操作,增删改查等