java1.8 流学习记录-oracle学习记录

java-stream

根据实体类对象中某个属性进行过滤:
resultList = resultList.stream()
                            .filter(o -> o.getCategory().getCategoryId().equals(dto.getCategoryId()))
                            .collect(Collectors.toList());
根据集合中某个对象的属性值进行排序:
resultList.sort(((o1, o2) -> Integer.parseInt(o1.getDistance()) - 
								Integer.parseInt(o2.getDistance())));
根据日期类型时间执行排序:
list = list.stream().sorted(Comparator.comparing(FunzoneListVo::getUpdateDate).reversed())
        .collect(Collectors.toList());
        
list = list.stream().sorted((o1,o2)->{
		try {
			return (int)(
					(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o1.getBrand()).getTime())
					-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o2.getBrand()).getTime())
					);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return 0;
	}
			)
		.collect(Collectors.toList());
多条件,有null值排序(在前:Comparator.nullsFirst(Integer::compareTo),在后:Comparator.nullsLast(Integer::compareTo)):
(.reversed():表示集合按当前字段进行倒叙,之后再按另一个字段进行倒叙;.thenComparing(QueryProxyInfoVo::getTotalAmount,Comparator.reverseOrder()):根据第一个属性进行排序之后,当属性值相同,再根据另一个属性进行排序)
list = list.stream().sorted(Comparator.comparing(QueryProxyInfoVo::getExamineSettleStatus
						,Comparator.nullsFirst(Integer::compareTo)).reversed()
                        .thenComparing(QueryProxyInfoVo::getTotalAmount,Comparator.reverseOrder())
                        .thenComparing(QueryProxyInfoVo::getCreateDate,Comparator.reverseOrder()))
                        .collect(Collectors.toList());
集合转map:
//不保证之前集合的排序
Map<String,ExpandProductDto> map = list.stream().collect(Collectors
						.toMap(ExpandProductDto::getProductId,ExpandProductDto->ExpandProductDto));
//保证之前的排序
Map<String, List<QueryProjectInfoVo>> map = list.stream().filter(o -> StringUtils.isNotEmpty(o.getCategoryName()))
                .collect(Collectors.groupingBy(o->o.getCategoryName(),LinkedHashMap::new,Collectors.toList()));
按字母分组:
Map<String, List<CityInfo>> collect = list.stream().filter(item -> StringUtils.isNotEmpty(item.getFirstLetter()))
                .collect(Collectors.groupingBy(CityInfo::getFirstLetter));
Map操作:
Map<String, List<QueryProjectInfoVo>> map = list.stream().filter(o -> StringUtils.isNotEmpty(o.getCategoryName()))
                .collect(Collectors.groupingBy(QueryProjectInfoVo::getCategoryName));
        if(StringUtils.isBlank(dto.getCategoryId())){//非点击更多操作,商品仅保留前6个
            for (Map.Entry<String, List<QueryProjectInfoVo>> entry : map.entrySet()) {
                if(entry.getValue().size() > 6){
                    entry.setValue(entry.getValue().subList(0,6));
                }
            }
        }
map指定排序:
//Java8中使用Stream对map进行排序
Map<Integer, List> result = map.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (oldValue, newValue) -> oldValue, LinkedHashMap::new));
//如果是根据关键字进行顺序排序,也可直接将HashMap的数据放入TreeMap中,保证关键字有序
对集合中某个字段进行指定字符的拼接:
a.若想要拼接的属性类型为整型,则需要转为字符串类型,然后进行指定字符的拼接
List<Integer> celebrityIdList = celebrityList().stream().filter(o -> null != 
		o.getCelebrityId()).map(OpenCelebrityVo::getCelebrityId)
		.collect(Collectors.toList());//整型集合
String celebrityId = 
		celebrityIdList.stream().map(String::valueOf).collect(Collectors.joining(","));//整型转字符串拼接
b.对集合中字符串类型执行拼接
String celebrityName = celebrityList().stream().filter(o -> null != 
	o.getName()).map(OpenCelebrityVo::getName).collect(Collectors.joining(","));
集合根据某个字段去重:
funzoneTypeDOList.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getId()))), ArrayList::new));
对两个集合进行比较,判断其中一个集合是否存在另一个集合中的属性值,可根据某个属性值是否存在在另一个集合中
for(FunzoneTypeInfoVo vo : funzoneTypeDOList){
    if(resultList.stream().filter(o -> o.getTypeName().equals(vo.getTypeName())).count() <= 0){//不包含
        //不包含指定的字段值
    }
}
Map转为ListList<MallSkuStockStateDTO> tempSkuList = mapGiftSku.entrySet().stream()
                        .map(o->new MallSkuStockStateDTO(o.getKey(),o.getValue())).collect(Collectors.toList());
java.stream 集合指定大小切割
public static void main(String[] args) {
	int max = 3;
	List<Integer> list = Lists.newArrayList();
	for(int i=0;i<20;i++){
	    list.add(i);
	}
	System.err.println("----------"+JSONObject.toJSONString(list));
	
	int limit = (list.size() + max - 1) / max;
	
	List<List<Integer>> mglist = new ArrayList<>();
	Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
	    mglist.add(list.stream().skip(i * max).limit(max).collect(Collectors.toList()));
	});
	
	System.err.println("----------"+JSONObject.toJSONString(mglist));
	
	List<List<Integer>> splitList = Stream.iterate(0, n -> n + 1).limit(limit).parallel()
	        .map(a -> list.stream().skip(a * max).limit(max).parallel().collect(Collectors.toList())).collect(Collectors.toList());
	
	System.out.println(splitList);
	}
stream分组过滤:
Map<String, List<QueryScheduleVO>> map = list.stream()
                    .collect(Collectors.groupingBy(QueryScheduleVO::getFilmName));
            List<QueryScheduleVO> temp = null;
            List<QueryScheduleVO> temp0 = null;
            for (Map.Entry<String, List<QueryScheduleVO>> mapList : map.entrySet()) {
                temp = mapList.getValue();//分组结果
                if (CollectionUtils.isEmpty(temp)){
                    continue;
                }
                Map<String, List<QueryScheduleVO>> tempMap = temp.stream()
                        .collect(Collectors.groupingBy(QueryScheduleVO::getShowTime));
                for (Map.Entry<String, List<QueryScheduleVO>> mapList0 : tempMap.entrySet()) {
                    temp0 = mapList0.getValue();//分组结果
                    if (CollectionUtils.isEmpty(temp0)){
                        continue;
                    }
                    //权重值越小,优先级越高
                    Optional<QueryScheduleVO> optional = Optional.ofNullable(temp0.stream().filter(o->o.getChannelStatus()).min(Comparator.comparing(QueryScheduleVO::getSettlePrice)
                            .thenComparing(QueryScheduleVO::getWight))).orElse(null);
                    if(optional.isPresent()){
                        result.add(optional.get());
                    }
                }
            }
            result = result.stream().sorted(Comparator.comparing(QueryScheduleVO::getShowTime))
                    .collect(Collectors.toList());
集合移除:
CopyOnWriteArrayList<MallSkuStockStateDTO> copy = new CopyOnWriteArrayList<>(skuStockQueryDTO.getSkuList());
if(CollectionUtils.isNotEmpty(skuListLockBuy)){//集合为空,不需要执行该逻辑
    for(MallSkuStockStateDTO dto : copy){
        if(skuListLockBuy.stream().filter(o->o.equals(dto.getSkuId())).count() > 0){//该sku不能购买
            copy.remove(dto);
        }
    }
}
list实现数据分页:
/**
 *
 * 开始分页
 * @param list
 * @param pageNum  页码
 * @param pageSize 每页多少条数据
 * @return
 */
public static List startPage(List list, Integer pageNum, Integer pageSize) {
    if (list == null||list.size() == 0) {
        return new ArrayList<>(0);
    }

    Integer count = list.size(); // 记录总数
    Integer pageCount = 0; // 页数
    if (count % pageSize == 0) {
        pageCount = count / pageSize;
    } else {
        pageCount = count / pageSize + 1;
    }

    int fromIndex = 0; // 开始索引
    int toIndex = 0; // 结束索引

    if (pageNum != pageCount) {
        fromIndex = (pageNum - 1) * pageSize;
        toIndex = fromIndex + pageSize;
    } else {
        fromIndex = (pageNum - 1) * pageSize;
        toIndex = count;
    }
    if(fromIndex >= list.size()){
        log.info("当前数据下标超过集合最大数据下标");
        return new ArrayList();
    }
    List pageList = list.subList(fromIndex, toIndex);
    return pageList;
}

java-LocalDateTime

比较时间先后顺序:
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
OpenFetchTicketWayWithShowVO vo = it.next();
if(StringUtils.isNotBlank(vo.getOnTime()) && StringUtils.isNotBlank(vo.getOffTime())
&& LocalDateTime.now().isBefore(LocalDateTime.parse(vo.getOnTime(),df)) || LocalDateTime.now().isAfter(LocalDateTime.parse(vo.getOffTime(),df))){
	//执行过滤内容
}

oracle-sql

百度/腾讯坐标系转换:
https://blog.csdn.net/myfmyfmyfmyf/article/details/45717797
sql,通过经纬度直接计算当前位置与指定位置的距离
Round(Round(2 * Asin(Sqrt(power(sin(( #{latitude} - v.LATITUDE) * ACOS(- 1) / 180 / 2), 2) +
                cos( #{latitude} * ACOS( - 1 ) /180) * cos(v.LATITUDE * ACOS(- 1) / 180) * power(sin(( #{longitude} - v.LONGITUDE)
                * ACOS(- 1) / 180 / 2), 2))) * 6378137 * 10000) / 10000 ,0) as distance
oracle分页sql方式一写法(第一页取0,第二页取1....):
select * from (
    	select ORDER_NO as orderNo, STATUS as status, rownum as rn from mall.qst_mall_order_info t where rownum <= (#{pageNum} + 1) * 50) t1 where t1.rn > #{pageNum} * 50;
分页方式二:
SELECT * FROM (
       SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( 
           select p.GIFT_NO as giftNo, p.GIFT_NAME as giftName, nvl(p.COST_PRICE,0) as costPrice, p.GIFT_URL as giftUrl, s.SKU_ID as skuId 
           from MALL.QST_MALL_GIFT_PACK p left join MALL.QST_MALL_SKU s on s.PRODUCT_ID = p.GIFT_NO where p.CREATE_USER_ID = 'S11' and p.GROUP_ID = '1' 
       ) TMP_PAGE) WHERE ROW_ID <= 10 AND ROW_ID > 0
mybatis框架.xml注解,<=转义格式:<![CDATA[<=]]>;或者可以使用 &lt;&gt;
判断时间先后:to_date(p.last_show_time,'yyyy-mm-dd hh24:mi:ss') > to_date('2021-11-09 18:00:00', 'yyyy-mm-dd hh24:mi:ss')
sql分组查询获取指定字段排序后的最后几条数据
select t1.id,t1.wx_phone as id from
(
  select t.id,t.wx_phone,row_number() over(partition by t.wx_phone order by t.create_date) rn from mem.qst_member t
) t1
where t1.rn > 1 and t1.wx_phone is not null


oracle数据库根据条件,存在则修改数据,不存在则插入数据
<insert id="mergeIntoProject" parameterType="com.qst.prepay.mall.api.model.dto.AltProjectDto">
        MERGE INTO MALL.QST_MALL_ACTIVITY_INFO t USING (SELECT #{no,jdbcType=VARCHAR} AS NO FROM DUAL) T1
        ON (T1.NO = T.NO)
        WHEN MATCHED THEN
            UPDATE SET
                <if test="actName != null and actName != ''">
                    T.ACT_NAME=#{actName,jdbcType=VARCHAR},
                </if>
                T.CREATE_DATE = sysdate
        WHEN NOT MATCHED THEN
            INSERT (
                NO,ACT_NAME,START_DATE,END_DATE,CREATE_DATE,LOGO_IMG_URL,IS_BIDDING,PRIORITY,ENTRANCE_IMG_URL,
                HOME_GIFT_FLAG,CREATE_SALE_NO,FORECAST_EARN
            )
            values (
                #{no,jdbcType=DECIMAL},
                #{actName,jdbcType=VARCHAR},
                #{startDate,jdbcType=TIMESTAMP},
                #{endDate,jdbcType=TIMESTAMP},
                #{createDate,jdbcType=TIMESTAMP},
                #{logoImgUrl,jdbcType=VARCHAR},
                #{isBidding,jdbcType=DECIMAL},
                #{priority,jdbcType=DECIMAL},
                #{entranceImgUrl,jdbcType=VARCHAR},
                #{homeGiftFlag,jdbcType=DECIMAL},
                #{saleNo,jdbcType=VARCHAR},
                #{forecastEarn,jdbcType=DECIMAL}
            )
    </insert>

<if test="remark != null and remark != ''">
	REMARK = #{remark,jdbcType=VARCHAR},
</if>
<update id="updateCardInfoStatus" parameterType="string">
    update CARD.QST_CARD_INFO set STATUS = 1,UPDATE_DATE = sysdate where CARD_KIND = 1 and CARD_NO in
    <foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
        #{item}
    </foreach>
</update>

mysql-sql

知识点:sql的执行顺序:
from -> join on -> where -> group by -> sum(),avg()...等聚合函数 -> having -> select -> distinct -> order by -> limit
DATE_SUB(SYSDATE(),INTERVAL 3 DAY):表示当前时间的前三天的那天日期
DATE_ADD(SYSDATE(),INTERVAL 3 DAY):表示当前时间的后三天的那天日期
update tb_in_out_record t set t.pass_time = DATE_SUB(SYSDATE(),INTERVAL 3 DAY)  WHERE t.id < 20 and t.id >=10;

SYSDATE():2022-09-02 20:22:37
CURDATE():2022-09-02 00:00:00

SELECT VERSION(); //查看当前数据库的版本号
show processlist;//查询当前数据库正在执行的进程
select @@global.sql_mode; 
设置当前或是全局用户的该参数(最好直接修改my.cnf数据库配置文件中的参数,永久有效:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION):
set GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 

mysql中的group by方式去重配合max()取值,这样取出的值会与预期效果不符,max方式取出的是所有分组数据中最大的那个字段的值,可能这些数据不是来自同一
条记录,是所有数据的结合体,解决方式如下:
SELECT
	id,
	audit_status
FROM
	(
	SELECT
			DISTINCT(a.id_number) idNumber, a.*
	FROM
			tb_report a
	WHERE
		a.id_number = '140221199511104819'
	ORDER BY
			a.id DESC 
	) t
GROUP BY
	id_number;
提示:如果报数据库语句分组错误,可尝试修改sql_mode参数,5.7版本之后该参数默认包含only_full

json

//解决三方接口大驼峰命名法的字段属性首字母大小写差异,返回数据首字母转为大写
方式一:
JSON.toJSONString(t,new PascalNameFilter());
方式二:
@JSONField(name = "CityId")

//解决json数据转化为对象/集合后使用报错
//引发原因:由于接三方接口json数据泛型后,对象为json数组类型,需要再次执行对象的具体指定,再次使用该对象是避免json类型转换的异常
String jsonStr = JSONObject.toJSONString(res.getData());
OpenVenueVo vo = JSONObject.parseObject(jsonStr, OpenVenueVo.class);
--------------------------------------------------------------------------------
String jsonStr = JSONObject.toJSONString(res.getData());
List<OpenCategoryVo> list = JSONObject.parseArray(jsonStr, OpenCategoryVo.class);

集合元素移除

CopyOnWriteArrayList<MallSkuStockStateDTO> copy = new CopyOnWriteArrayList<>(skuStockQueryDTO.getSkuList());
if(CollectionUtils.isNotEmpty(skuListLockBuy)){//集合为空,不需要执行该逻辑
    for(MallSkuStockStateDTO dto : copy){
        if(skuListLockBuy.stream().filter(o->o.equals(dto.getSkuId())).count() > 0){//该sku不能购买
            copy.remove(dto);
        }
    }
}
定时器:
https://blog.csdn.net/yjltx1234csdn/article/details/105846493
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值