当前位置: 首页 > news >正文

在哪一个网站上做劳务合同备案网站前台模板免费下载

在哪一个网站上做劳务合同备案,网站前台模板免费下载,微信公众号运营一年多少钱,虹口手机网站制作我刚读完“ JDK 8收集器的强大功能的一种例外” #xff0c;我不得不说我很失望。 Java冠军 Simon Ritter是Oracle的前Java推广者#xff0c;现在是Oracle的Java传播者#xff0c;现在是Azul Systems的副CTO#xff08;使用JVM的人 #xff09;写了它#xff0c;因此我希… 我刚读完“ JDK 8收集器的强大功能的一种例外” 我不得不说我很失望。 Java冠军 Simon Ritter是Oracle的前Java推广者现在是Oracle的Java传播者现在是Azul Systems的副CTO使用JVM的人 写了它因此我希望对流有一些有趣的见解。 相反帖子归结为 使用流减少行数 你可以和收藏家一起做花哨的东西 流中的异常很烂 这不仅是肤浅的而且文章还采用了一些不合标准的开发实践。 现在西蒙Simon写道这只是一个小型演示项目所以我想他并没有将所有的专业知识投入其中。 尽管如此它还是很草率的而且更糟的是那里的许多人犯了同样的错误并重复了相同的比喻。 看到它们被引用在许多不同的地方即使各自的作者在按下时可能无法捍卫这些观点也肯定不会帮助开发人员对如何使用流获得良好的印象。 因此我决定借此机会写一篇反驳的文章-不仅是针对这篇文章而且是对所有重复的文章的反驳。 总是指出我的观点是多余的毕竟这是我的博客并且很累人所以我不会这样做。但是请记住这一点因为我说的某些东西即使它们是事实也是如此。仅是我的观点。 问题 关于发生了什么事情以及为什么发生的原因有很多解释但最终归结为我们有一个来自HTTP POST请求的查询字符串并且想要将参数解析为更方便的数据结构。 例如给定字符串a foob bara fu我们希望得到类似a〜 {foofu} b〜 {bar}的名称。 我们也有一些在网上找到的已经执行此操作的代码 private void parseQuery(String query, Map parameters)throws UnsupportedEncodingException {if (query ! null) {String pairs[] query.split([]);for (String pair : pairs) {String param[] pair.split([]);String key null;String value null;if (param.length 0) {key URLDecoder.decode(param[0],System.getProperty(file.encoding));}if (param.length 1) {value URLDecoder.decode(param[1],System.getProperty(file.encoding));}if (parameters.containsKey(key)) {Object obj parameters.get(key);if(obj instanceof List) {List values (List)obj;values.add(value);} else if(obj instanceof String) {List values new ArrayList();values.add((String)obj);values.add(value);parameters.put(key, values);}} else {parameters.put(key, value);}}} } 我认为没有提及作者的名字是一种好意因为此代码段在很多层面上都是错误的因此我们甚至都不会讨论。 我的牛肉 从这里开始本文将说明如何向流重构。 这就是我开始不同意的地方。 简洁流 这就是重构的动机 看完这个之后我认为我可以[...]使用流来使其更加简洁。 当人们把它作为使用流的第一个动机时我讨厌它 认真地说我们是Java开发人员如果可以提高可读性我们习惯于编写一些额外的代码。 信息流与简洁无关 因此信息流与简洁无关。 相反我们习惯于循环因此我们经常将大量操作塞入循环的主体行中。 当向流重构时我经常将操作分开从而导致更多的行。 相反流的神奇之处在于它们如何支持思维模式匹配。 因为他们只使用了少数几个概念主要是map / flatMapfilterreduce / collect / find所以我可以快速了解正在发生的事情并集中精力进行操作最好是一个接一个地进行。 for (Customer customer : customers) {if (customer.getAccount().isOverdrawn()) {WarningMail mail WarningMail.createFor(customer.getAccount());// do something with mail} }customers.stream().map(Customer::getAccount).filter(Account::isOverdrawn).map(WarningMail::createFor).forEach(/* do something with mail */ ); 在代码中遵循通用的“客户映射到帐户过滤透支的帐户映射到警告邮件”然后费时费力地“为从客户那里获得的帐户创建警告邮件但前提是透支才容易得多”。 但是为什么这是抱怨的理由 每个人都有自己的喜好对吗 是的但是专注于简洁性会导致错误的设计决策。 例如我经常决定通过为其创建一个方法并使用一个方法引用来总结一个或多个操作如连续映射。 这样可以带来不同的好处例如将流管道中的所有操作都保持在相同的抽象级别上或者简单地命名本来就很难理解的操作您知道意图显示名称和内容。 如果我专注于简洁性我可能不会这样做。 减少代码行数也可能导致将多个操作组合到一个lambda中从而节省了两个映射或过滤器。 再次这打败了背后的目的 因此当您看到一些代码并考虑将其重构为流时不要数行来确定您的成功 使用丑陋的力学 循环要做的第一件事也是启动流的方法我们将查询字符串与符分开然后对结果键值对进行操作。 该文章如下 Arrays.stream(query.split([])) 看起来不错 老实说没有。 我知道这是创建流的最佳方式但只是因为我们必须这样做 这样并不意味着我们来看看它。 而且我们在这里所做的沿着正则表达式分割字符串似乎也很普通。 那么为什么不将其推入实用程序功能呢 public static StreamString splitIntoStream(String s, String regex) {return Arrays.stream(s.split(regex)); } 然后我们使用splitIntoStreamquery“ []”启动流。 一种简单的“提取方法”重构但效果更好。 次优数据结构 还记得我们想做什么 将类似a foob bara fu的内容解析为a〜 {foofu} b〜 {bar}。 现在我们怎么可能代表结果呢 看起来我们正在将单个字符串映射到许多字符串所以也许我们应该尝试Map StringList String 那绝对是个不错的初衷……但这绝不是我们能做的最好的 首先为什么要列出清单 订单真的很重要吗 我们需要重复的值吗 我猜这两项都不对所以也许我们应该尝试一套 无论如何如果您曾经创建过一个以值为集合的地图那么您就会知道这有些不愉快。 总是存在这样的极端情况“这是第一个要素吗” 考虑。 尽管Java 8减轻了麻烦…… public void addPair(String key, String value) {// map is a MapString, SetStringmap.computeIfAbsent(key, k - new HashSet()).add(value); } …从API的角度来看还远远不够完美。 例如迭代或流式传输所有值是一个两步过程 private T StreamT streamValues() {// map could be a Map?, CollectionTreturn map.values().stream().flatMap(Collection::stream); } 长话短说我们正在将需要的东西从键到多个值的映射变成我们想到的第一件事从键到单个值的映射。 那不是一个好的设计 尤其是因为我们的需求非常匹配 Guava的Multimap 。 也许有充分的理由不使用它但在这种情况下至少应该提及它。 毕竟本文的目的是找到一种处理和表示输入的好方法因此它应该在为输出选择数据结构方面做得很好。 虽然一般来说这是一个反复出现的主题但它并不是非常特定于流的。我没有将其归类为5个常见的对立部分但仍然想提及它因为这样可以使最终结果更好。 康妮插图 说到常见的比喻...一种是使用溪流的老照片为帖子添加一些颜色。 有了这个我很乐意承担 由Dan Zen在CC-BY 2.0下发布 贫血管道 您是否曾经看到几乎什么都不做但突然将所有功能塞入单个操作的管道 这篇文章对我们的小解析问题的解决方案是一个完美的例子我删除了一些空处理以提高可读性 private MapString, ListString parseQuery(String query) {return Arrays.stream(query.split([])).collect(groupingBy(s - (s.split([]))[0],mapping(s - (s.split([]))[1], toList()))); } 这是我在阅读本文时的思考过程“好吧所以我们用符分隔查询字符串然后耶稣在他妈的棍子上那是什么” 然后我冷静下来意识到这里隐藏着一个抽象-通常不追求它而让我们大胆地做到这一点。 在这种情况下我们将请求参数a foo拆分为[afoo]然后分别处理这两个部分。 因此在流中包含该对的流水线中不应该走一步吗 但这是一种罕见的情况。 流的元素通常是某种类型我想用其他信息来丰富它。 也许我有大量的客户并希望将其与他们居住的城市配对。请注意我不想用城市代替客户-这是一个简单的地图-但需要同时使用这两个功能例如将城市映射到居住的客户在其中。 正确表示中间结果是可读性的福音。 两种情况有什么共同点 他们需要代表一对。 他们为什么不呢 因为Java没有惯用的方法。 当然您可以使用数组适用于我们的请求参数 Map.Entry 某些库的元组类甚至特定于域的东西。 但很少有人做这使得代码做到的是通过一个有点令人惊讶脱颖而出。 不过我还是喜欢这种方式。 正确表示中间结果是可读性的福音。 使用Entry看起来像这样 private MapString, ListString parseQuery(String query) {return splitIntoStream(query, []).map(this::parseParameter).collect(groupingBy(Entry::getKey,mapping(Entry::getValue, toList()))); }private EntryString, String parseParameter(String parameterString) {String[] split parameterString.split([]);// add all kinds of verifications herereturn new SimpleImmutableEntry(split[0], split[1]); } 我们仍然有魔术收藏家要处理但那里发生的事情最少。 收藏魔术 Java 8附带了一些疯狂的收集器 尤其是那些转发给下游收集器的收集器我们已经看到如何滥用它们来创建不可读的代码。 如我所见它们之所以存在是因为没有元组就没有办法准备复杂的约简。 所以这是我的工作 我尝试通过正确准备流的元素来使收集器尽可能简单如有必要我为此使用元组或特定于域的数据类型。 如果仍然需要做一些复杂的事情可以将其放入实用程序方法中。 吃我自己的狗粮这怎么办 private MapString, ListString parseQuery(String query) {return splitIntoStream(query, []).map(this::parseParameter).collect(toListMap(Entry::getKey, Entry::getValue)); }/** Beautiful JavaDoc comment explaining what the collector does. */ public static T, K, V CollectorT, ?, MapK, ListV toListMap(FunctionT, K keyMapper, FunctionT, V valueMapper) {return groupingBy(keyMapper, mapping(valueMapper, toList())); } 它仍然很丑陋-尽管不是那么可怕-但至少我不必一直都在看它。 如果我愿意返回类型和合同注释将使您更容易了解发生的情况。 或者如果我们决定使用Multimap我们会四处寻找匹配的收集器 private MultimapString, String parseQuery(String query) {return splitIntoStream(query, []).map(this::parseParameter).collect(toMultimap(Entry::getKey, Entry::getValue)); } 在这两种情况下我们甚至可以更进一步对条目流进行特殊处理。 我将其留给您练习。 :) 异常处理 本文在处理流时面临的最大挑战是异常处理。 它说 不幸的是如果您回头查看原始代码将会发现我方便地省略了一个步骤使用URLDecoder将参数字符串转换为其原始格式。 问题是URLDecoder :: decode会引发检查的UnsupportedEncodingException因此无法将其简单地添加到代码中。 那么本文采用哪种方法解决这一相关问题 鸵鸟之一 最后我决定保留我的第一个超薄方法。 由于在这种情况下我的Web前端未进行任何编码因此我的代码仍然可以正常工作。 嗯...文章标题没有提到例外吗 因此不应该为此多花点时间吗 无论如何错误处理总是很困难流增加了一些约束和复杂性。 讨论不同的方法需要花费时间而且具有讽刺意味的是我并不热衷于将其压缩到帖子的最后部分。 因此让我们详细讨论如何使用运行时异常欺骗或monad来解决该问题而不是考虑最简单的解决方案。 一个操作要做的最简单的事情就是筛选出引起麻烦的元素。 因此该操作不是将每个元素映射到一个新元素而是将一个元素映射到零或一个元素。 在我们的情况下 private static StreamEntryString, String parseParameter(String parameterString) {try {return Stream.of(parseValidParameter(parameterString));} catch (IllegalArgumentException | UnsupportedEncodingException ex) {// we should probably log the exception herereturn Stream.empty();} }private static EntryString, String parseValidParameter(String parameterString)throws UnsupportedEncodingException {String[] split parameterString.split([]);if (split.length ! 2) {throw new IllegalArgumentException(/* explain whats going on */);}return new SimpleImmutableEntry(URLDecoder.decode(split[0], ENCODING),URLDecoder.decode(split[1], ENCODING)); } 然后我们在flatMap而不是地图中使用parseParameter并获取可以拆分和解码的条目流以及一堆日志消息告诉我们在什么情况下出现问题。 摊牌 这是文章的最终版本 private MapString, List parseQuery(String query) {return (query null) ? null : Arrays.stream(query.split([])).collect(groupingBy(s - (s.split([]))[0],mapping(s - (s.split([]))[1], toList()))); } 摘要说 由此得出的结论是使用流和收集器的灵活性可以大大减少复杂处理所需的代码量。 缺点是当这些令人讨厌的异常抬起头来时这种方法就不能很好地工作了。 这是我的 private MultimapString, String parseQuery(String query) {if (query null)return ArrayListMultimap.create();return splitIntoStream(query, []).flatMap(this::parseParameter).collect(toMultimap(Entry::getKey, Entry::getValue)); }// plus parseParameter and parseValidParameter as above// plus the reusable methods splitIntoStream and toMultimap 行更多是的但是流管道具有更少的技术组合通过URL解码参数来设置完整的功能集可接受或至少存在异常处理适当的中间结果明智的收集器以及良好的性能结果类型。 它带有两个通用实用程序功能可以帮助其他开发人员改善其开发流程。 我认为多余的几行值得所有。 因此我的收获有所不同使用流以简单可预测的方式使用流的构建块来使代码揭示其意图。 抓住机会寻找可重用的操作尤其是那些创建或收集流的操作不要害羞地调用小方法以保持管道可读。 最后但并非最不重要的一点忽略行数。 圣经后 顺便说一下借助Java 9对流API的增强 我们不必对空查询字符串进行特殊情况处理 private MultimapString, String parseQuery(String query) {return Stream.ofNullable(query).flatMap(q - splitIntoStream(q, [])).flatMap(this::parseParameter).collect(toMultimap(Entry::getKey, Entry::getValue)); } 等不及了 翻译自: https://www.javacodegeeks.com/2016/09/rebutting-5-common-stream-tropes.html
http://www.huolong8.cn/news/430599/

相关文章:

  • 深圳宝安沙井网站建设网站策划书撰写
  • 自己做衣服的网站怎么将自己的视频推广出去
  • 做玻璃的网站网站开发有哪些竞赛
  • 房产信息查询系统官方网站资源网站优化排名软件公司
  • 大连模版网站百度小程序入口
  • 公司网站与推广浙江seo外包
  • 怎么自己做个免费网站吗弹窗广告最多的网站
  • 更新备案 网站 打开vs网页设计教程
  • 服务器不能访问网站网站建设步骤及推广方法
  • 做宣传网站买什么云服务器南联网站建设推广
  • 网站转化率低处方药可以做网站吗
  • 阳泉推广型网站建设东莞建设网站制作
  • 什么样的网站才是好网站自助建站基础工作主要包括
  • 小说网站编辑怎么做做机械设备网站
  • 广州网站建设开发线上注册公司流程和费用
  • 低价网站建设顺德大型门户网站开发费用
  • 如何评价一个网站做的是否好建立网站就是制作网页吗
  • 做传销网站的广州有哪些科技公司
  • 做雕塑网站找哪家好域名备案和网站备案的区别
  • 如何建设移动网站常用的软件开发工具有哪些
  • 教育培训机构招生网站建设链接网
  • 做网站彩票代理多少钱啊筑龙建筑资料网
  • 甘肃制作网站营销型网站建设教程视频教程
  • 四川省城市建设培训中心 网站哈尔滨快速建站专业定制
  • 淮滨网站建设公司宁德小程序开发
  • 网站建设公司模版wordpress商城主题模板下载
  • 免费企业网站建设免费房地产销售政策
  • wordpress 登入seo职业发展
  • 上海网站平台建设网新中英企业网站管理系统
  • 建公司网站的详细步骤前端和后端哪个难