ElasticSearch: 前缀查询

在Kibana的开发工具中执行:

1
2
3
4
5
6
7
8
9
10
GET /es_info/_search
{
  "query": {
    "prefix": {
      "phone": {
        "value": "136"
      }
    }
  }
}

Java(Spring Data ElasticSearch):

1
2
3
4
5
6
7
8
9
10
NativeSearchQueryBuilder nativeSearchQueryBuilder =
            new NativeSearchQueryBuilder().withFields("id");
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    queryBuilder.must(QueryBuilders.prefixQuery("phone","136"));
    Query query =
            nativeSearchQueryBuilder
                    .withQuery(queryBuilder)
                    .build();
    SearchHits<ESInfo> searchHits =
            elasticsearchOperations.search(query, ESInfo.class);

Java: List转Map

java标志
image-3362

1
2
3
4
5
6
7
// 定义实体类.
record Student(String id,String name,int age){
}

// 方法.
List<Student> students= new ArrayList<>(1);
Map<String, Student> studentIdToStudent = students.stream().collect(Collectors.toMap(Student::id,  Function.identity()));

Java: 多值Map

可以使用Spring框架中的MultiValueMap.该类非线程安全.

java标志
image-3356

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.util.MultiValueMap;
import org.springframework.util.LinkedMultiValueMap;

MultiValueMap<String,String> map=new LinkedMultiValueMap<>(50);
map.add("a","aaaa");
map.add("a","bbbb");
map.add("a","cccc");
map.add("a","ddddd");
System.out.println(map.get("a"));

// 输出:

// [aaaa, bbbb, cccc, ddddd]

Java: Switch模式匹配

使用JDK19.

java标志
image-3353

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
调用:

testStringOrNull("aazzz");
testStringOrNull(null);
testStringOrNull(1);

*/


static void testStringOrNull(Object o) {
        switch (o) {
            case String s,null -> System.out.println(s);
            case Integer i -> System.out.println("Integer");
            default -> {
            }    // Now exhaustive!
        }
    }

Java: 虚拟线程来了

java标志
image-3349

类似Go语言的协程,在用户线程上执行更多操作.该特性在JDK 19中进行预览,具体可以参考: JEP 425: Virtual Threads (Preview)

先在https://jdk.java.net/ 下载安装JDK 19 .然后编译:

1
D:\jdk19\bin\java --source 19 --enable-preview Main.java
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
import java.time.Duration;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;


public class MainTest {

  public static void main(String[] args) {
    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
      Thread.ofVirtual()
          .name("virtual Thread")
          .unstarted(
              () -> {
                System.out.println("线程名称: " + Thread.currentThread().getName());
                System.out.println("是否虚拟线程: " + Thread.currentThread().isVirtual());
                System.out.println("------------------------------------------");
              })
          .start();

      IntStream.range(0, 10_000)
          .forEach(
              i ->
                  executor.submit(
                      () -> {
                        Thread.sleep(Duration.ofSeconds(1));
                        var currentThread = Thread.currentThread();
                        System.out.println(
                            "是否为虚拟线程: "
                                + currentThread.isVirtual()
                                + ",线程名称: "
                                + currentThread.getName()
                                + ",当前: "
                                + i);
                        return i;
                      }));
    }
  }
}