JAVA8问题处理回顾-持续更新

金额累加问题 使用Reduce进行累加操作,参考这里 List<BigDecimal> bdList = new ArrayList<>(); //populate list BigDecimal result = bdList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); 查找集合的最后一个元素 JAVA8的Stream只提供了FindFirst功能,没有FindLast功能,可以使用Reduce来实现查找最后一个元素的效果 import java.util.*; import java.util.stream.*; public class GetLastEleFromCollection { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aaa"); list.add("idddd"); list.add("bbbb"); String lastElement = list.stream() .reduce((first, second) -> second) .orElse(null); System.out.println(lastElement); } } bbbb 比较两个时间是否是同一天 import java.time.*; import java.time.temporal.*; public class CompareDay { public static void main(String[] args) { final LocalDateTime now = LocalDateTime.now(); final LocalDateTime localDateTime = LocalDateTime.of(2019, 9, 29, 0, 0, 0); System.out.println(localDateTime.truncatedTo(ChronoUnit.DAYS).isEqual(now.truncatedTo(ChronoUnit.DAYS))); } } true 实现与Python的zip函数功能 import java.util.*; import java.util.function.*; public class Zip { public static void main(String[] args) { List<List<Integer>> result = handle(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), (i, j) -> Arrays.asList(i, j)); System.out.println(result); } public static <T, U, R> List<R> handle(List<T> list, List<U> list1, BiFunction<T, U, R> biFunction) { List<R> result = new ArrayList<>(); for(int i = 0; i < list.size(); i ++) { result.add(biFunction.apply(list.get(i), list1.get(i))); } return result; } } [[1 (\, 4)] (\, [2 (\, 5)]) (\, [3 (\, 6)])] 多个Predicate链 import java.util.*; import java.util.stream.*; import java.util.function.*; public class MorePredicate { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); final Predicate<Integer> predicate = i -> i % 2 == 0; final Predicate<Integer> predicate1 = predicate.and(integer -> integer > 5); List<Integer> result = list.stream() .filter(predicate1) .collect(Collectors.toList()); System.out.println(result); } } [6]

2019-08-24 ·  (🌟Updated: 2019-09-29) · 2 min · 220 words · tomyli

Apollo Client自定义问题拾遗

由于公司很多服务要接入Apollo配置中心,并且对于项目的接入有网络要求,根据官方说明,需要自定义Client来完成 接入步骤 新建maven项目 在Idea中新建maven项目,基于quickstart构建 增加项目依赖 官方说明的建议在新的client中依赖Apollo官方的client,再根据业务进行扩展,所以maven依赖apollo-client,公司项目的网络访问需要通过L5来进行,所以还要依赖L5的jar,目前这个jar包没有maven坐标,只能以lib方式引入 自定义MetaServer 关键的部分,自定义满足公司网络条件的MetaServer,Apollo官网说明是实现MetaServerProvider且Order值小的Providor被使用,按照说明进行实现 Maven打包Client 执行 mvn clean install 进行打包,解压jar包发现就只有一个Providor的实现类,这样jar运行有问题。需要把新Client所有的依赖都打进jar包,在网上找了半天,需要在POM中增加maven的plugin的配置,如下: <!-- 打包所有的maven依赖到jar包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <artifactSet> <excludes> <exclude>junit:junit</exclude> </excludes> </artifactSet> </configuration> </execution> </executions> </plugin> <!-- 添加依赖的非maven jar包 --> <plugin> <groupId>com.googlecode.addjars-maven-plugin</groupId> <artifactId>addjars-maven-plugin</artifactId> <version>1.0.5</version> <executions> <execution> <goals> <goal>add-jars</goal> </goals> <configuration> <resources> <resource> <directory>${basedir}/lib</directory> </resource> </resources> </configuration> </execution> </executions> </plugin> 由于项目中使用了maven依赖与非maven依赖,所以上述的两个插件都要使用。增加了上面两个插件后再运行打包命令查看生成的jar就发现所有的依赖都在jar中了。 项目中使用Client 选择一个项目在测试环境进行配置调试,自定义的Meta Server一直没有生效,所以查找官方文档,由于自定义Providor是通过SPI方式实现的,所以正确的实现方式是新建resource文件夹,指定MetaServerProvider的真正实现类的带包名类才可以,哎,找了我好久。 后续操作 后续会把client上传到内部maven仓库,完善配置API,使业务方可以零配置来使用配置中心。 总结 Maven的打包机制还是不清晰,处理打包问题费了很多时间,要好好重新学习一下 Apollo的官方文档还需要再仔细阅读,有问题多查issue,因为可能有人已经遇到了 多读读源码,真正的体会大牛的软件设计思想

2019-07-01 ·  (🌟Updated: 2019-07-01) · 1 min · 70 words · tomyli

Apollo 配置中心畅游

目前市面上的开源产品 Disconf 2014年7月百度开源的配置管理中心,同样具备配置的管理能力,目前已经不维护了,最近的一次代码提交是两年前了。 Spring Cloud Config 2014年9月开源,Spring Cloud生态组件,与Spring Cloud体系无缝整合。 Apollo 2016年5月,携程框架部开源的配置管理中心,具备规范的权限、流程治理等特性。 Nacos 2018年6月,阿里开源的配置中心,可以做DNS和RPC的服务发现。 为什么选择Apollo 社区活跃 刚刚发布了1.4.0版本,Issue处理速度快 文档齐全 体验,部署,设计文档都齐全 重要的灰度发布 想发布一台机器试试水,可以! 开源协议友好 Apache 2 license Apollo都有哪些重要功能 以下摘自官网说明 统一管理不同环境、不同集群的配置 配置修改实时生效(热发布) 版本发布管理 目前只支持对最近版本的恢复。https://github.com/ctripcorp/apollo/issues/1642 灰度发布 权限管理、发布审核、操作审计 编辑与发布是两个独立的操作。 客户端配置信息监控 提供Java和.Net原生客户端 提供开放平台API 这样可以通过其它方式来查看配置信息,平台API说明 使用方便的后台配置系统Portal 分布式部署相对较复杂,这是缺点 外部依赖少,目前依赖Mysql Apollo的组成 Apollo长什么样? Apollo整体设计 总体架构 代码结构 各模块概要介绍 Apollo Config Service 提供配置获取接口,服务对象为Apollo客户端 Apollo Admin Service 提供配置管理(修改、发布)接口,服务与Portal Apollo Portal 提供WEB界面供用户管理配置 Apollo的重要设计 Admin Service与Config Service的通信方式 Apollo使用Mysql实现消息(ReleaseMessage)的处理,消息内容为AppId+Cluster+Namespace,具体的设计思想可以参考这里 客户端与服务端的通信方式 客户端与服务端保持一个长连接(通过Http Long Polling实现) Client Server 重要的Namespace Namespace是配置项的集合,类似于一个配置文件的概念,获取的权限分为private与public两种权限。 Namespace的类型 私有类型 公有类型 关联类型(继承类型) Cluster能用来做什么? 分机房实例,分任务功能实例,比如在一些实例执行job,需要增加-Dapollo.cluster=配置指定集群名 ...

2019-05-09 ·  (🌟Updated: 2019-06-25) · 1 min · 108 words · tomyli

ARTS-打卡第一天

Algorithm LeetCode 第一题 题目描述 给一个int数组,返回数组中两个数字相加的和是目标 数的下标。可以假设每个输入只有一个解决方案,并且不能使用同一个元素两次。 Example 给出nums = [2, 7, 11, 15], 目标数为9,则返回[0, 1] 题目解答 import java.util.*; public class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i ++) { int second = target - nums[i]; if(map.containsKey(second)) { return new int[]{map.get(second), i}; } map.put(nums[i], i); } return new int[]{}; } } 相比两次循环的方式,这种处理的时间复杂度为O(n), 空间复杂度也为O(n). ...

2019-05-09 ·  (🌟Updated: 2020-01-08) · 1 min · 129 words · tomyli

Centos7 install issue collect

由于工作需要,使用VMWare虚拟机安装了Centos7系统,遇到了很多问题,现在把这些问题记录下来,以备后用。 解决Centos7 yum could not retrieve mirrorlist错误 刚安装好的VM使用ip add查看局域网的ip没有结果,这个参考https://my.oschina.net/u/2456768/blog/3011881 配置静态ip 安装虚拟机就是模拟多个机器通讯的情况,但是目前的配置是机器ip是动态获取的,老是变,每次都得看ip,所以需要配置一下VMware来支持静态ip。主要机器上的配置信息为: IPADDR=192.168.116.101 NETMASK=255.255.255.0 GATEWAY=192.168.116.2 DNS1=192.168.116.2 这个参考了https://blog.csdn.net/zhishengqianjun/article/details/77046796 Centos7安装后配置国内仓库源 由于国内访问centos的原始源慢,需要换成163的软件源,新安装的系统执行命令都提示not found,只能从物理下载源的配置再上传到VM中,但是首先得知道VM的ip地址,使用ifconfig是不可能了,查了一下可以使用 ip a 来查看VM的ip地址,这样配置源的的问题可以解决了,具体的配置源的方法参考https://blog.csdn.net/inslow/article/details/54177191 Centos7安装VMware Tools 想更好的让VM与物理机协同,则VMware Tools必须要安装,好久不用linux的我连挂载也忘的一干二净了。搜了一下,参考https://blog.csdn.net/WarnerWu/article/details/73718901 完成VMware Tools的安装。这样共享目录的功能就可以正常使用了 安装Jdk8 一句命令搞定: yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 安装mysql 使用yum安装mysql需要下载安装mysql的源,更新后就可以安装了,这个参考了https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7/ 修改mysql的root密码 安装完mysql后登录找不到密码了,其实在使用yum安装时会mysql会自动生成一个随机密码,这个密码可以在安装的日志中找到。此方法参考了https://blog.csdn.net/kuluzs/article/details/51924086 开放3306端口 为了方便mysql工具进行操作,需要开放3306端口。Centos7的防火墙还改了。具体就3个命令: systemctl start firewalld firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload 这个参考了https://www.jianshu.com/p/225a853350d9 安装oh-my-bash 由于一般服务器都自带bash为默认的shell,但是操作起来着实不方便,安装oh-my-bash可以对shell进行一些增强。https://github.com/ohmybash/oh-my-bash Centos自动登录 安装后每次启动VM都要输入密码,这个对于自己测试很麻烦,要使Centos能登录后自动登录需要做以下操作: 移除原来的getty@tty1.service软链接 rm /etc/systemd/system/getty.target.wants/getty@tty1.service 拷贝getty@.service file 并且命名为 getty@tty1.service cp /lib/systemd/system/getty@.service /etc/systemd/system/getty@tty1.service 编辑新拷贝的getty@tty1.service,修改以下内容,最后一行必须加上 [Service] ... ExecStart=-/sbin/agetty --autologin root --noclear %I ... [Install] ... ;Alias=getty@tty1.service 在getty.target.wants目录做一下软链接 ...

2019-05-06 ·  (🌟Updated: 2019-06-26) · 1 min · 85 words · tomyli

那些高效的Chrome插件

Surfingkeys 👍 严重推荐,VIM键盘模拟,自定义程度非常高 Immersive Translate 👍 无敌翻译软件,支持网页、PDF、本地文件翻译 Tampermonkey 👍 用户自定义脚本管理器 Enhanced GitHub Github加强版,显示仓库大小,下载单个文件等好用功能。插件地址 眺览 TillGlance 👍 一目十行的阅读方式 Elmo - Your AI companion to create summaries and insights 最大优点是生成的摘要最接近原文 Language Reactor 探索、理解并从母语材料中学习的完美助手 PeekLink - Chrome Web Store 浏览体验大升级 iorate/ublacklist: Blocks specific sites from appearing in Google search results WeRead to Readwise Sync, 微信读书笔记同步到Readwise - Chrome Web Store podStation Podcast Player - Chrome Web Store 浏览器中播放播客,支持下载 RSSHub Radar - Chrome Web Store Burning Vocabulary - Reading and Vocabulary Mate j3sch/logseq-clipper: A browser extension for capturing web content directly into your Logseq graph. Adapted from Obsidian’s Web Clipper. 优化logseq官方插件,直接捕获内容 ...

2019-03-08 ·  (🌟Updated: 2026-04-01) · 2 min · 326 words · tomyli

那些提高效率的命令行工具

brew Mac软件包管理工具。用命令行命令来安装软件,仓库软件丰富。地址 bat bat? No,高端cat,不费眼。带颜色显示,支持git状态,自动分页。地址 cowsay 奶牛说: 地址 coreutils 使用Rust重写的gnuutils。地址 direnv 环境变量切换,可以指定在进入某一文件夹后的操作,比如输出一条欢迎语句,在退出文件夹后则卸载变量(操作),它的stdlib内置了一些功能来处理环境。 地址 exa ls、tree的替代者,支持多种显示方式,支持按指定条件排序显示。地址 duti mac默认软件打开程序配置。再也不用一个手动的点击设置了,可以脚本化。地址 riggrep 强大的find,查询速度更快,支持匹配结果的字符替换,支持定义输出颜色。地址 fortune 英文名言集合,可以使用fortunes进行扩展,对中文用户更友好。地址 fzf 强大的交互式搜索,大大提高效率,官网提供了很多实用的操作目录与git的命令。地址 goku 改键神器Karabiner的配置管理器,更健康,更人性化。地址 htop 交互式的top信息显示,支持配色。地址 imgcat 命令行看图片。可以控制显示的高度、宽度。地址 jq json内容操作显示。支持分离、过滤、转换元素,判断JSON元素节点是否存在等功能,内置了很多方便的函数。 地址 jenv JDK版本管理命令行工具,支持全局、当前目录、当前shell的jdk版本指定。还可以指定Java虚拟机指定的JVM参数。支持插件的启用与禁用。地址 lnav log file navigator,增加的日志查看,可以根据日志级别显示不同颜色的日志信息。支持分页显示。地址 lolcat 命令、文件内容多彩输出。地址 m-cli Mac的瑞士军刀,支持各种mac组件(Dock,蓝牙,WIFI,Finder)的操作。地址 mackup Mac应用配置同步,支持多种存储方式。支持自定义应用的同步配置。主要命令为backup,restore,uninstall。地址 mas 命令行安装apple store应用。地址 mycli 命令行中的mysql客户端。地址 ncdu 增强版本的du,机器空间使用查询,支持扫描结果导出与导入,支持多种排序方式。地址 Ranger 命令行下的文件管理,强大到没朋友。地址 pandoc 文档转换,支持非常多的的格式转换。地址 pyenv pythne版本管理工具。地址 pyenv-virtualenv pythne虚拟环境管理,管理pyenv配置的环境。地址 prettyping 增强的ping,图形化显示,可以轻松的看出ping的地址的网络状况。地址 rtv 命令行中浏览reddit。地址 s-search 命令行下进行web搜索。地址 tmux 终端多会话管理器。地址 tldr 命令快速查询。简单的man。地址 Terminal Notify 命令行操作mac显示通知,支持图标显示与点击后操作(如打开网址,执行命令)等。地址 w3m 终端浏览器,操作方便。地址 ...

2018-09-30 ·  (🌟Updated: 2021-02-04) · 1 min · 119 words · tomyli

那些提高效率的Alfred Workflow

Alfred Maestro 操作Maestro的workflow,可以直接查找macro并执行。插件地址 Alfred github workflow 搜索github上的项目,可以搜索项目,人物等。插件地址 MyIP 快速的查询本机的ip,包括本地IP与外网IP。 SwitchHosts! 在alfred中快速本地host的配置,配合SwitchHosts来使用。插件地址 SnippetsLab 在alfred中快速查看SnippetsLab中的代码片断 VMWare Control 在alfred中控制vmware虚拟机。支持启动、停止、挂起、切换等操作。插件地址 lxbrvr/alfred-keepassxc-workflow: Alfred workflow for fetching the attributes of the KeepassXC entries. Alfred 快速密码访问 Alfred Browser Toolbox Toolbox是一个文件操作浏览的工具,它支持创建、查找文件的功能,还可以查询pdf文件,非常方便。Mac上的Finder使用确定不方便。这里有具体的使用方式。 Alfred Keywords Help 安装的workflow多了,记忆触发的keyword就比较困难,使用Keywords help这个插件可以显示出所有已经安装的workflow的触发key,还可以根据workflow进行查询。 Alfred My Mind 快速查询Nikita的githubpage内容的workflow,我在他的文章里面学到了很多。插件地址 Awesome lists 快速查询Github上awesome列表的workflow,只为发现更多。插件地址,这个也是Nikita的作品。 Baidu Map 在alfred上使用百度地图。插件地址 Birthday 在alfred中显示你来到这个世界多长时间,让你珍惜每一分,每一秒。插件地址 Calendar 在alfred中显示出当月的日历信息。插件地址 Chromes Bookmarks 在aflred中搜索Chrome浏览器的书签,非常的好用。插件地址 Common Search 国内常用网站的搜索,现在支持知乎、淘宝、掘金、github。插件地址 Dash 在alfred中进行Dash的搜索,开发者必备。插件地址 Directory watches 本地目录文件查看,指定目录的搜索,回收站文件显示。 Emacs Workflow 在alfred中进行emacs的操作,比如打开文件等。插件地址 Git Repos 搜索本地的git文件夹,搜索到后可以使用指定软件进行打开,开发时很有用。插件地址 Google Chrome History 在alfred中快速查看Chrome的浏览历史。插件地址 ...

2018-09-21 ·  (🌟Updated: 2025-01-03) · 1 min · 174 words · tomyli

那些提高效率的Idea插件

.ignore 插件说明 ignore文件忽略,支持绝大多数的开发语言,支持直接导航到忽略的文件,在创建时可以选择模板,比如Java开发可以选择Java与Idea选项来生成忽略target文件与.idea文件等的忽略规则。 项目地址 https://github.com/hsz/idea-gitignore IdeaVim 插件说明 在Idea中使用vi键位来进行编码操作,可以很高的提高效率,插件支持自定义键位来对Idea的action来进行定制,程序员可以根据自己的编程习惯来定制出一个键盘流来. 项目地址 https://github.com/JetBrains/ideavim IdeaVimExtension Plugin for JetBrains IDEs | JetBrains Marketplace IdeaVim的扩展功能 emacsIDEAs 插件说明 支持一些Emacs操作的Idea插件,主要是一些复制,移动,替换,跳转的快捷操作,目前使用最多的是快速查找替换. 项目地址 https://github.com/whunmr/emacsIDEAs acejump/AceJump: 🅰️ single character search, select, and jump Idea中快速跳转 支持行模式 支持IdeaVim集成 Custom Postfix Templates 插件说明 Idea中非常高效的就是postfix,但是系统自带不可以进行增加,这个插件就可以让用户可以自定义一些高级的postfix语句来提高效率。 项目地址 https://github.com/xylo/intellij-postfix-templates Jrebel 插件说明 动态部署代码插件,可以在不重启Tomcat的情况下进行代码的热部署,提高开发效率没得说。先前可以使用twitter号来免费使用,现在不行,需要自行购买了。 项目地址 https://zeroturnaround.com/software/jrebel/ HotSwapHelper 开源免费的热部署插件 CamelCase 插件说明 文本驼峰规则快速转换,支持从CamelCase->camelCaase->camel_case->camel-case->CAMEL_CASE的顺序转换,idea中只支持全部大写与全部小写的转换. 项目地址 https://plugins.jetbrains.com/plugin/7160-camelcase Codehelper 插件说明 代码自动生成插件,支持根据Pojo名来生成dao,mapper,xml等文件,目前使用较少 生成实体类的setter方法,使用频率高,主要是生成类的setter方法,配合F2查找下一个错误而使焦点至上而下,操作起来非常顺畅。 项目地址 https://github.com/zhengjunbase/codehelper.generator Translation 插件说明 Idea中集成翻译功能,目前支持有道和goolge,百度翻译. 项目地址 https://github.com/izhangzhihao/intellij-rainbow-brackets Clock 插件说明 当你全屏投入工作时,想知道当前的时间,需要切换出全屏模式,这样就打乱了节奏,这个插件可以在Idea的右下方显示出当前的时间信息,非常实用。 插件地址 https://github.com/xamgore/intellij-clock ...

2018-09-05 ·  (🌟Updated: 2025-02-25) · 2 min · 233 words · tomyli

设计模式学习之代理模式

说明 代理模式是设计模式中使用频率非常的高的模式,像日常生活中的房产中介、外卖平台都属于代理。代理模式就是在访问真正的业务之时不会直接与真正的业务进行调用,而是与一个与真正业务对象有着相同功能声明的代理来进行处理,但是最终的处理还是由真正的业务类来进行(决定),比如房产中介,他们会帮助找房者根据条件来对可选房屋进行筛选,但是最终订与不订的权利还是由找房者来决定。常见的代理有保护代理、虚拟代理、远程代理。 代理模式 我们常用的后台系统一般会根据用户权限的不同对用户展示不同的业务菜单,拥有高权限的人会展示相对多的菜单进行操作,在这个过程中还要记录用户的操作日志,用户点了什么,执行了什么操作都需要进行记录,达到有据可查。在这个业务场景下,就可以使用代理模式进行实现。代理对象会持有一个真正业务对象的实例,在代理对象中还引用日志服务与权限服务,所有的请求都经过这个代理类来进行,这样就可以根据操作的用户的状态来进行相应的处理了。具体的代码实现如下: 定义一个查询接口,在这里定义一个查询用户收入的方法,如下: package cn.imcompany.proxy; /** * Created by tomyli on 2018/6/28. * Github: https://github.com/peng051410 */ public interface Search { void queryIncome(String username); } 再定义一个实现该接口的具体业务类: package cn.imcompany.proxy; /** * Created by tomyli on 2018/6/28. * Github: https://github.com/peng051410 */ public class SearchService implements Search { @Override public void queryIncome(String username) { System.out.println(username + "开始查询"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(username + "查询完成"); } } 在上面代码中就实现了查询收入的方法,简单的打印了两行日志。 ...

2018-07-16 ·  (🌟Updated: 2019-06-26) · 1 min · 189 words · tomyli