首页 文章 精选 留言 我的

精选列表

搜索[效率提升],共10006篇文章
优秀的个人博客,低调大师

效率提升50倍,轻松处理大数据

阿里云流计算正式上线——新用户免费试用一个月 日前,阿里云宣布流计算(Aliyun StreamCompute,Powered by Blink)正式发布商业化版本。阿里云流计算是运行在阿里云平台上的流式大数据分析平台,提供给用户在云上进行流式数据实时化分析工具,实现对网站数据、工业化数据、物联网数据等各种场合进行实时的数据监控、分析和处理。 流计算典型架构 解决痛点 阿里云流计算可以提供BlinkSQL协助用户简单轻松完成流式计算逻辑的处理。同时,受限于SQL代码功能有限无法满足某些特定场景的业务需求,阿里云流计算提供全功能的UDF函数,帮助用户完成业务定制化的数据处理逻辑。在流数据分析领域用户直接使用BlinkSQL+UDF即可完成大部分流式数据分析处理逻辑,目前的流计算更擅长于做流式数据分析、统计、处理。主

优秀的个人博客,低调大师

这10 个工具,让你效率提升

题图来自 http:// ifanr.com 百度脑图 naotu.baidu.com 百度脑图是一个在线的思维导图工具,当你创建一个节点,点击右键,就可以选择创建下级,同级的节点,当然也有很多很方便的快捷键,Enter 创建下级节点,Tab 创建同级节点,还可以标注优先级和进度。并且你所有的数据都会保存在云端,你还可以和好友一块分享。 马克飞象 maxiang.info 马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器。配合印象笔记强大的存储和同步功能,除了基本语法,它还支持 LaTeX 公式、流程图、本地图片以及附件上传,甚至截图粘贴。还支持选择笔记本和添加标签。它同时提供Win、Mac 客户端和Chrome 离线App。 星际加速器 rallets.com 星际加速器是一款科学上网工具,它支持iOS,Android,Mac,Win 多平台,目前iOS 免费,并且不限流量,你只需下载客户端,一键就可以开启,并且可以选择多个国家的节点(需要注册账号)。 Airdroid airdroid.com 利用Airdroid,可以在PC,Mac 上管理你的Android 手机。它可以接收设备所有通知,不会错过电话、短信、邮件等重要通知,并且垃圾短信,电话,直接挂断,还可以直接回复短信。并且还可以传送文件等等很多功能,比如当你在办公的时候,可以在电脑上操作手机。甚至当你的手机丢了,也可以用它的辅助功能。 坚果云 jianguoyun.com 坚果云是一个网盘服务,在Dropbox 在国内被和谐,坚果云作为Dropbox 的替代品也再合适不过了。而它的很多功能也和Dropbox 类似。而它的特色就是同步功能,只需要一个账户,全平台的数据都会自动备份,而且它还会保留每个文件的历史版本,当你修改文档删删改改,使用它再也不用担心数据丢失了,想要查看历史版本只需从网页版找到。 锤子便签 note.t.tt 作为一个每个人都需要的便签工具,作为情怀锤出品,质量自然是不用说了,锤子便签简直太让人省心了,简洁的界面,支持Markdown,没有多余的修饰,都为它加分不少,它不仅可以输入文字,还可以插入图片,进行图文混排也在适合不过了,你可以随时随地将便签的内容生成长微博或者图片,分享出去。 Prezi prezi.com Prezi 是一个炫酷的PPT 演示制作工具,你可以使用它放大缩小来演示,还可以使用3D 效果来导航演示,还可以旋转。你可以显示所有部分,点击下一步,就显示局部的一小块,再点击下一步就跳转到另一个小部分了,而这中间的动画你都可以自定义设置,只是这效果多会让人大赞。同时还可以导入PPT 的数据。 ApkPure apkpure.com ApkPure 是一个下载Android Apk(Apk 是Android 手机安装文件) 网站。我们都知道国内的应用市场好多App 都找不到,Google Play 上不去,安装Google Play 它还挺麻烦。ApkPure 就解决了这个尴尬的境地了,你可以下载国内搜不到的Android App,以后妈妈再也不用担心我找不到Android App,同时它也有Android 客户端。 文图 wentu.io 文图是一款在线编辑的数据可视化工具。它支持上百种图标类型,文字样式,而且还有丰富的模板。只需双击就可以编辑,随时随地所见即所得的显示。它还会自动保存备份,还可以二维码分享,并且支持图片,PDF 格式输出。在所有的平台都能自动适配显示。 作者:佚名 来源:51CTO

优秀的个人博客,低调大师

揭秘Android开发效率提升多倍的利器;Gradle

Gradle是什么? Gradle是一种构建语言,目前是Android的默认构建工具,我们编写的编译脚本,其实就是玩Gradle的API,所以从它更底层的意义上看,是一个编程框架。 因为涉及的内容很多没法一两篇文章就介绍详细清楚,方便起见我用PPT图片的形式简单介绍一下。如果需要更详细了解学习的朋友可以看文末。 一.Gradle介绍 二.Gradle 之语言基础 Groovy ; 三.Gradle的重要概念; 1.Gradle Wrapper介绍; 2.Closure; 3.带有闭包的方法调用; 4.闭包重要知识点; 5.Gradle tasts 6.Gradle 插件 四.多维度打包 五.Gradle 的工作流程 详细的讲解介绍; 上面截图中的视频可以免费分享,加Android高级开发群;701740775 备注csdn领取Gradle教程

优秀的个人博客,低调大师

Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍

> 最近在看一个同学代码的时候,发现代码中大量使用了 Google 开源的 Guava 核心库中的内容,让代码简单清晰了不少,故学习分享出 Guava 中我认为最实用的功能。 Guava 项目是 Google 公司开源的 Java 核心库,它主要是包含一些在 Java 开发中经常使用到的功能,如数据校验、不可变集合、计数集合,集合增强操作、I/O、缓存、字符串操作等。并且 Guava 广泛用于 Google 内部的 Java 项目中,也被其他公司广泛使用,甚至在新版 JDK 中直接引入了 Guava 中的优秀类库,所以质量毋庸置疑。 使用方式直接 mavan 依赖引入。 <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupid>com.google.guava</groupid> <artifactid>guava</artifactid> <version>30.0-jre</version> </dependency> <!-- more --> 数据校验 数据校验说来十分简单,一是非空判断,二是预期值判断。非空判断我想每一个 Java 开发者都很熟悉,一开始都经常和 NullPointException 打交道。处理的方式我们自然是一个 if( xx == null) 就能轻松解决。预期值判断也是类似,检查数据值是不是自己想要的结果即可。 即使这么简单的操作,我们是不是还经常出错呢?而且写起来的代码总是一行判断一行异常抛出,怎么看都觉得那么优雅。还好,现在就来尝试第一次使用 Guava 吧。 非空判断 String param = "未读代码"; String name = Preconditions.checkNotNull(param); System.out.println(name); // 未读代码 String param2 = null; String name2 = Preconditions.checkNotNull(param2); // NullPointerException System.out.println(name2); 引入了 Guava 后可以直接使用 Preconditions.checkNotNull 进行非空判断,好处为觉得有两个,一是语义清晰代码优雅;二是你也可以自定义报错信息,这样如果参数为空,报错的信息清晰,可以直接定位到具体参数。 String param2 = null; String name2 = Preconditions.checkNotNull(param2,"param2 is null"); // java.lang.NullPointerException: param2 is null 预期值判断 和非空判断类似,可以比较当前值和预期值,如果不相等可以自定义报错信息抛出。 String param = "www.wdbyte.com2"; String wdbyte = "www.wdbyte.com"; Preconditions.checkArgument(wdbyte.equals(param), "[%s] 404 NOT FOUND", param); // java.lang.IllegalArgumentException: [www.wdbyte.com2] 404 NOT FOUND 是否越界 Preconditions 类还可以用来检查数组和集合的元素获取是否越界。 // Guava 中快速创建ArrayList List<string> list = Lists.newArrayList("a", "b", "c", "d"); // 开始校验 int index = Preconditions.checkElementIndex(5, list.size()); // java.lang.IndexOutOfBoundsException: index (5) must be less than size (4) 代码中快速创建 List 的方式也是 Guava 提供的,后面会详细介绍 Guava 中集合创建的超多姿势。 不可变的集合 创建不可变集合是我个人最喜欢 Guava 的一个原因,因为创建一个不能删除、不能修改、不能增加元素的集合实在是太实用了。这样的集合你完全不用担心发生什么问题,总的来说有下面几个优点: 线程安全,因为不能修改任何元素,可以随意多线程使用且没有并发问题。 可以无忧的提供给第三方使用,反正修改不了。 减少内存占用,因为不能改变,所以内部实现可以最大程度节约内存占用。 可以用作常量集合。 创建方式 说了那么多,那么到底怎么使用呢?赶紧撸起代码来。 // 创建方式1:of ImmutableSet<string> immutableSet = ImmutableSet.of("a", "b", "c"); immutableSet.forEach(System.out::println); // a // b // c // 创建方式2:builder ImmutableSet<string> immutableSet2 = ImmutableSet.<string>builder() .add("hello") .add(new String("未读代码")) .build(); immutableSet2.forEach(System.out::println); // hello // 未读代码 // 创建方式3:从其他集合中拷贝创建 ArrayList<string> arrayList = new ArrayList(); arrayList.add("www.wdbyte.com"); arrayList.add("https"); ImmutableSet<string> immutableSet3 = ImmutableSet.copyOf(arrayList); immutableSet3.forEach(System.out::println); // www.wdbyte.com // https 都可以正常打印遍历结果,但是如果进行增删改,会直接报 UnsupportedOperationException . 其实 JDK 中也提供了一个不可变集合,可以像下面这样创建。 ArrayList<string> arrayList = new ArrayList(); arrayList.add("www.wdbyte.com"); arrayList.add("https"); // JDK Collections 创建不可变 List List<string> list = Collections.unmodifiableList(arrayList); list.forEach(System.out::println);// www.wdbyte.com https list.add("未读代码"); // java.lang.UnsupportedOperationException 注意事项 使用 Guava 创建的不可变集合是拒绝 null 值的,因为在 Google 内部调查中,95% 的情况下都不需要放入 null 值。 使用 JDK 提供的不可变集合创建成功后,原集合添加元素会体现在不可变集合中,而 Guava 的不可变集合不会有这个问题。 List<string> arrayList = new ArrayList&lt;&gt;(); arrayList.add("a"); arrayList.add("b"); List<string> jdkList = Collections.unmodifiableList(arrayList); ImmutableList<string> immutableList = ImmutableList.copyOf(arrayList); arrayList.add("ccc"); jdkList.forEach(System.out::println);// result: a b ccc System.out.println("-------"); immutableList.forEach(System.out::println);// result: a b 如果不可变集合的元素是引用对象,那么引用对象的属性是可以更改的。 其他不可变集合 不可变集合除了上面演示的 set 之外,还有很多不可变集合,下面是 Guava 中不可变集合和其他集合的对应关系。 可变集合接口 属于JDK还是Guava 不可变版本 Collection JDK ImmutableCollection List JDK ImmutableList Set JDK ImmutableSet SortedSet/NavigableSet JDK ImmutableSortedSet Map JDK ImmutableMap SortedMap JDK ImmutableSortedMap Multiset Guava ImmutableMultiset SortedMultiset Guava ImmutableSortedMultiset Multimap Guava ImmutableMultimap ListMultimap Guava ImmutableListMultimap SetMultimap Guava ImmutableSetMultimap BiMap Guava ImmutableBiMap ClassToInstanceMap Guava ImmutableClassToInstanceMap Table Guava ImmutableTable 集合操作工厂 其实这里只会介绍一个创建方法,但是为什么还是单独拿出来介绍了呢?看下去你就会大呼好用。虽然 JDK 中已经提供了大量的集合相关的操作方法,用起来也是非常的方便,但是 Guava 还是增加了一些十分好用的方法,保证让你用上一次就爱不释手, 创建集合。 // 创建一个 ArrayList 集合 List<string> list1 = Lists.newArrayList(); // 创建一个 ArrayList 集合,同时塞入3个数据 List<string> list2 = Lists.newArrayList("a", "b", "c"); // 创建一个 ArrayList 集合,容量初始化为10 List<string> list3 = Lists.newArrayListWithCapacity(10); LinkedList<string> linkedList1 = Lists.newLinkedList(); CopyOnWriteArrayList<string> cowArrayList = Lists.newCopyOnWriteArrayList(); HashMap<object, object> hashMap = Maps.newHashMap(); ConcurrentMap<object, object> concurrentMap = Maps.newConcurrentMap(); TreeMap<comparable, object> treeMap = Maps.newTreeMap(); HashSet<object> hashSet = Sets.newHashSet(); HashSet<string> newHashSet = Sets.newHashSet("a", "a", "b", "c"); Guava 为每一个集合都添加了工厂方法创建方式,上面已经展示了部分集合的工厂方法创建方式。是不是十分的好用呢。而且可以在创建时直接扔进去几个元素,这个简直太赞了,再也不用一个个 add 了。 集合交集并集差集 过于简单,直接看代码和输出结果吧。 Set<string> newHashSet1 = Sets.newHashSet("a", "a", "b", "c"); Set<string> newHashSet2 = Sets.newHashSet("b", "b", "c", "d"); // 交集 SetView<string> intersectionSet = Sets.intersection(newHashSet1, newHashSet2); System.out.println(intersectionSet); // [b, c] // 并集 SetView<string> unionSet = Sets.union(newHashSet1, newHashSet2); System.out.println(unionSet); // [a, b, c, d] // newHashSet1 中存在,newHashSet2 中不存在 SetView<string> setView = Sets.difference(newHashSet1, newHashSet2); System.out.println(setView); // [a] 有数量的集合 这个真的太有用了,因为我们经常会需要设计可以计数的集合,或者 value 是 List 的 Map 集合,如果说你不太明白,看下面这段代码,是否某天夜里你也这样写过。 统计相同元素出现的次数(下面的代码我已经尽可能精简写法了)。 JDK 原生写法: // Java 统计相同元素出现的次数。 List<string> words = Lists.newArrayList("a", "b", "c", "d", "a", "c"); Map<string, integer> countMap = new HashMap<string, integer>(); for (String word : words) { Integer count = countMap.get(word); count = (count == null) ? 1 : ++count; countMap.put(word, count); } countMap.forEach((k, v) -&gt; System.out.println(k + ":" + v)); /** * result: * a:2 * b:1 * c:2 * d:1 */ 尽管已经尽量优化代码,代码量还是不少的,那么在 Guava 中有什么不一样呢?在 Guava. 中主要是使用 HashMultiset 类,看下面。 ArrayList<string> arrayList = Lists.newArrayList("a", "b", "c", "d", "a", "c"); HashMultiset<string> multiset = HashMultiset.create(arrayList); multiset.elementSet().forEach(s -&gt; System.out.println(s + ":" + multiset.count(s))); /** * result: * a:2 * b:1 * c:2 * d:1 */ 是的,只要把元素添加进去就行了,不用在乎是否重复,最后都可以使用 count 方法统计重复元素数量。看着舒服,写着优雅,HashMultiset 是 Guava 中实现的 Collection 类,可以轻松统计元素数量。 一对多,value 是 List 的 Map 集合。 假设一个场景,需要把很多动物按照种类进行分类,我相信最后你会写出类似的代码。 JDK 原生写法: HashMap<string, set<string>&gt; animalMap = new HashMap&lt;&gt;(); HashSet<string> dogSet = new HashSet&lt;&gt;(); dogSet.add("旺财"); dogSet.add("大黄"); animalMap.put("狗", dogSet); HashSet<string> catSet = new HashSet&lt;&gt;(); catSet.add("加菲"); catSet.add("汤姆"); animalMap.put("猫", catSet); System.out.println(animalMap.get("猫")); // [加菲, 汤姆] 最后一行查询猫得到了猫类的 "加菲" 和 ”汤姆“。这个代码简直太烦做了,如果使用 Guava 呢? // use guava HashMultimap<string, string> multimap = HashMultimap.create(); multimap.put("狗", "大黄"); multimap.put("狗", "旺财"); multimap.put("猫", "加菲"); multimap.put("猫", "汤姆"); System.out.println(multimap.get("猫")); // [加菲, 汤姆] HashMultimap 可以扔进去重复的 key 值,最后获取时可以得到所有的 value 值,可以看到输出结果和 JDK 写法上是一样的,但是代码已经无比清爽。 字符串操作 作为开发中最长使用的数据类型,字符串操作的增强可以让开发更加高效。 字符拼接 JDK 8 中其实已经内置了字符串拼接方法,但是它只是简单的拼接,没有额外操作,比如过滤掉 null 元素,去除前后空格等。先看一下 JDK 8 中字符串拼接的几种方式。 // JDK 方式一 ArrayList<string> list = Lists.newArrayList("a", "b", "c", null); String join = String.join(",", list); System.out.println(join); // a,b,c,null // JDK 方式二 String result = list.stream().collect(Collectors.joining(",")); System.out.println(result); // a,b,c,null // JDK 方式三 StringJoiner stringJoiner = new StringJoiner(","); list.forEach(stringJoiner::add); System.out.println(stringJoiner.toString()); // a,b,c,null 可以看到 null 值也被拼接到了字符串里,这有时候不是我们想要的,那么使用 Guava 有什么不一样呢? ArrayList<string> list = Lists.newArrayList("a", "b", "c", null); String join = Joiner.on(",").skipNulls().join(list); System.out.println(join); // a,b,c String join1 = Joiner.on(",").useForNull("空值").join("旺财", "汤姆", "杰瑞", null); System.out.println(join1); // 旺财,汤姆,杰瑞,空值 可以看到使用 skipNulls() 可以跳过空值,使用 useFornull(String) 可以为空值自定义显示文本。 字符串分割 JDK 中是自带字符串分割的,我想你也一定用过,那就是 String 的 split 方法,但是这个方法有一个问题,就是如果最后一个元素为空,那么就会丢弃,奇怪的是第一个元素为空却不会丢弃,这就十分迷惑,下面通过一个例子演示这个问题。 String str = ",a,,b,"; String[] splitArr = str.split(","); Arrays.stream(splitArr).forEach(System.out::println); System.out.println("------"); /** * * a * * b * ------ */ 你也可以自己测试下,最后一个元素不是空,直接消失了。 如果使用 Guava 是怎样的操作方式呢?Guava 提供了 Splitter 类,并且有一系列的操作方式可以直观的控制分割逻辑。 String str = ",a ,,b ,"; Iterable<string> split = Splitter.on(",") .omitEmptyStrings() // 忽略空值 .trimResults() // 过滤结果中的空白 .split(str); split.forEach(System.out::println); /** * a * b */ 缓存 在开发中我们可能需要使用小规模的缓存,来提高访问速度。这时引入专业的缓存中间件可能又觉得浪费。现在可以了, Guava 中提供了简单的缓存类,且可以根据预计容量、过期时间等自动过期已经添加的元素。即使这样我们也要预估好可能占用的内存空间,以防内存占用过多。 现在看一下在 Guava 中缓存该怎么用。 @Test public void testCache() throws ExecutionException, InterruptedException { CacheLoader cacheLoader = new CacheLoader<string, animal>() { // 如果找不到元素,会调用这里 @Override public Animal load(String s) { return null; } }; LoadingCache<string, animal> loadingCache = CacheBuilder.newBuilder() .maximumSize(1000) // 容量 .expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间 .removalListener(new MyRemovalListener()) // 失效监听器 .build(cacheLoader); // loadingCache.put("狗", new Animal("旺财", 1)); loadingCache.put("猫", new Animal("汤姆", 3)); loadingCache.put("狼", new Animal("灰太狼", 4)); loadingCache.invalidate("猫"); // 手动失效 Animal animal = loadingCache.get("狼"); System.out.println(animal); Thread.sleep(4 * 1000); // 狼已经自动过去,获取为 null 值报错 System.out.println(loadingCache.get("狼")); /** * key=猫,value=Animal{name='汤姆', age=3},reason=EXPLICIT * Animal{name='灰太狼', age=4} * key=狗,value=Animal{name='旺财', age=1},reason=EXPIRED * key=狼,value=Animal{name='灰太狼', age=4},reason=EXPIRED * * com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 狼. */ } /** * 缓存移除监听器 */ class MyRemovalListener implements RemovalListener<string, animal> { @Override public void onRemoval(RemovalNotification<string, animal> notification) { String reason = String.format("key=%s,value=%s,reason=%s", notification.getKey(), notification.getValue(), notification.getCause()); System.out.println(reason); } } class Animal { private String name; private Integer age; @Override public String toString() { return "Animal{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Animal(String name, Integer age) { this.name = name; this.age = age; } } 这个例子中主要分为 CacheLoader、MyRemovalListener、LoadingCache。 CacheLoader 中重写了 load 方法,这个方法会在查询缓存没有命中时被调用,我这里直接返回了 null,其实这样会在没有命中时抛出 CacheLoader returned null for key 异常信息。 MyRemovalListener 作为缓存元素失效时的监听类,在有元素缓存失效时会自动调用 onRemoval 方法,这里需要注意的是这个方法是同步方法,如果这里耗时较长,会阻塞直到处理完成。 LoadingCache 就是缓存的主要操作对象了,常用的就是其中的 put 和 get 方法了。 总结 上面介绍了我认为最常用的 Guava 功能,Guava 作为 Google 公司开源的 Java 开发核心库,个人觉得实用性还是很高的。引入后不仅能快速的实现一些开发中常用的功能,而且还可以让代码更加的优雅简洁。我觉得适用于每一个 Java 项目。Guava 的其他的功能你也可以自己去发现。它的 Github 地址是:https://github.com/google/guava. 参考 https://github.com/google/guava/wiki 订阅 >文章已经收录在 Github.com/niumoo/JavaNotes ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 Star 和完善,希望我们一起变得优秀。 文章每周持续更新,有帮助可以点个「赞」或「分享」,都是支持,我都喜欢! 要实时关注更新的文章以及分享的干货,可以关注 未读代码 公众号(下方二维码)或者我的网站。 </string,></string,></string,></string,></string></string></string></string,></string></string></string,></string></string></string,></string,></string></string></string></string></string></string></string></object></comparable,></object,></object,></string></string></string></string></string></string></string></string></string></string></string></string></string></string></string></string>

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册