Java 技术笔记
v博客前言
vlist提取字段生成新list
List<Integer> uidList = urResult.stream().map(p -> p.getUserId()).collect(Collectors.toList());
vList中根据某个字段条件生成新list
List<User> temp = uList.stream().filter(item -> item.getUid() == 10000).collect(Collectors.toList());
v去除List符合条件的元素
Optional<Ticket> oTicket = topicList.stream().filter(p -> p.getId().equals(to.getId())).findFirst(); if (oTopic.isPresent()) { Ticket tempTicket = oTicket.get(); }
vMybatis批量修改
<update id="updateBatch" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";"> update course <set> name=${item.name} </set> where id = ${item.id} </foreach> </update>
vMybatis实现InsertOrUpdate
<insert id="saveOrUpdate" > <selectKey keyProperty="count" resultType="int" order="BEFORE"> select count(*) from country where id = #{id} </selectKey> <if test="count > 0"> update country set countryname = #{countryname},countrycode = #{countrycode} where id = #{id} </if> <if test="count==0"> insert into country values(#{id},#{countryname},#{countrycode}) </if> </insert>
条件限制
根据不同的判断逻辑,会有所不同,就上面这个例子而言,就要求实体类中包含count
属性(可以是别的名字)。否则selectKey
的结果没法保存,如果入参是个Map
类型,就没有这个限制。
说明
从例子来看除了有个限制外,也没别的麻烦。
通过selectKey做第一次查询,然后根据结果进行判断,所以这里的order="BEFORE"
是必须的。
也是因为BEFORE
,所以没法通过<bind>
标签来临时存储中间的值,只能在入参中增加属性来存放。
v异步线程Thread
new Thread(){ public void run() { // 方法体 } }.start();
vJava计算代码执行时间
long startTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis(); float seconds = (endTime - startTime) / 1000F; System.out.println("Cost seconds" + Float.toString(seconds));
Stopwatch stopwatch = Stopwatch.createStarted(); // Todo 业务逻辑 stopwatch.stop(); log.info("cost [%d] second. (﹁.﹁))", stopwatch.elapsed(TimeUnit.SECONDS));
v随机指定范围内N个不重复的数
/** * 随机指定范围内N个不重复的数 * 最简单最基本的方法 * @param min 指定范围最小值 * @param max 指定范围最大值 * @param n 随机数个数 */ public static int[] getRandomList(int min, int max, int n){ if (n > (max - min + 1) || max < min) { return null; } int[] result = new int[n]; int count = 0; while(count < n) { int num = (int) (Math.random() * (max - min)) + min; boolean flag = true; for (int j = 0; j < n; j++) { if(num == result[j]){ flag = false; break; } } if(flag){ result[count] = num; count++; } } return result; }
v逗号分隔字符串转List
String categorys = "12,34,54,64,6,4,32"; List<Integer> listIds = Arrays.asList(categorys.split(",")) .stream().map(s -> Integer.parseInt(s.trim())) .collect(Collectors.toList()); listIds.forEach(s ->System.out.print(s+" ")); //结果:12 34 54 64 6 4 32
vidList排序获得的结果集modelList
// ******** 造点数据 ******** List<User> userList = new ArrayList<>(); for(int i = 0; i < 5; i++){ User user = new User(); user.setId(i); user.setName(i+"aaaaa"+i); userList.add(user); } List<Integer> idList = new ArrayList<>(); idList.add(4); idList.add(1); idList.add(3); idList.add(4); idList.add(5); idList.add(2); idList.add(3); // ******** 关键部分 ******** idList = idList.stream().distinct().collect(Collectors.toList()); if(idList.size() > 1) { Dictionary<Integer, User> dictionary = new Hashtable<>(); userList.forEach(item -> dictionary.put(item.getId(), item) ); userList = new ArrayList<>(); for(int i = 0; i < idList.size(); i++){ userList.add(dictionary.get(idList.get(i))); } }
v查询listA中的listB的元素在listC中出现过的子集
List<TestModel> list = new ArrayList<>(); Set<String> set = new HashSet<>(); list = list.stream().filter(item -> item.getList() !=null && item.getList().size() > 0 && item.getList().stream().anyMatch( seriesId -> set.contains(String.valueOf(seriesId)) )).collect(Collectors.toList());
vfilter元素不存在则返回null
int studentId = 3; Student student = students.stream().filter(o -> o.getId() == studentId).findAny().orElse(null);
v数组转list
String[] array = {"1","2","3","4","5","6","7","8","9"}; // 数组和list互转 List<String> list = Arrays.asList(array); // list转数组 方案1 String[] array1 = list.toArray(new String[]{}); // list转数组 方案2 String[] array2 = list.toArray(new String[0]); // list转数组 方案3(推荐) String[] array3 = list.toArray(new String[list.size()]);
vList转Map的三种方法
// 声明一个List集合 List<Person> list = new ArrayList(); list.add(new Person("1001", "小A")); list.add(new Person("1002", "小B")); list.add(new Person("1003", "小C")); System.out.println(list); // 将list转换map Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId,Person::getName)); // 重复时用后面的value 覆盖前面的value Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key2 )); // 重复时将前面的value 和后面的value拼接起来 Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 )); // 重复时将重复key的数据组成集合 Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId, p -> { List<String> getNameList = new ArrayList<>(); getNameList.add(p.getName()); return getNameList; }, (List<String> value1, List<String> value2) -> { value1.addAll(value2); return value1; } ));
vsqlserver查询结果逗号分隔
select STRING_AGG(CAST(id AS NVARCHAR(MAX)),',') AS ids from TableName where id>2
vstring[]转list integer
String[] strArr = {"1", "2", "3"}; List<Integer> intList = Arrays.stream(strArr) .map(Integer::parseInt) .collect(Collectors.toList());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)