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

电子商务网站建设 填空题wordpress主题 食品

电子商务网站建设 填空题,wordpress主题 食品,制作一个私人网站怎么申请域名,房地产网站欣赏转载自 使用Java 8 Stream像操作SQL一样处理数据#xff08;下#xff09; 在上一篇文章中#xff0c;我们介绍了Stream可以像操作数据库一样来操作集合#xff0c;但是我们没有介绍 flatMap 和 collect 操作。这两种操作对实现复杂的查询是非常有用的。比如你可以结果 fl…转载自 使用Java 8 Stream像操作SQL一样处理数据下 在上一篇文章中我们介绍了Stream可以像操作数据库一样来操作集合但是我们没有介绍 flatMap 和 collect 操作。这两种操作对实现复杂的查询是非常有用的。比如你可以结果 flatMap 和 collect 计算stream中的单词的字符数像下面代码那样。 import static java.util.function.Function.identity; import static java.util.stream.Collectors.*;StreamString words Stream.of(Java, Magazine, is, the, best);MapString, Long letterToCount words.map(w - w.split()).flatMap(Arrays::stream).collect(groupingBy(identity(), counting())); 上述代码的运行结果是 [a:4, b:1, e:3, g:1, h:1, i:2, ..] 这篇文章将会介绍flatMap和collect这两种操作的更多细节。 flatMap操作 假设你在一个文章中查找一个单词你会怎么做 我们可以使用 Files.lines() 方法因为它可以返回一个文章一行一行信息组成的stream。我们可以使用 map() 把文章的每行分割是很多单词最后使用distinct()移除重复的。我们将想法转化为代码 Files.lines(Paths.get(stuff.txt)).map(line - line.split(\\s)) .distinct() // StreamString[].forEach(System.out::println); 很不幸这样并不正确。如果你运行得到这样的结果 [Ljava.lang.String;7cca494b [Ljava.lang.String;7ba4f24f … 到底发生了什么事呢问题出在使用的lambda表达式将会把文件的每行转化成一个字符串数组(String[])。这就导致map返回的是一个StreamString[]类型的结果我们实际上需要的是一个Stream类型的结果。 我们需要一串的单词而不是一串的数组。对于数组可以使用 Arrays.stream() 将数组变成一个stream。看下面的实现 String[] arrayOfWords {Java, Magazine}; StreamString streamOfwords Arrays.stream(arrayOfWords); 如果我们使用下面方式的话其实还有不起作用的这是因为使用 map(Arrays::stream) 后返回的其实是StreamStream类型。 Files.lines(Paths.get(stuff.txt)).map(line - line.split(\\s)) // StreamString[].map(Arrays::stream) // StreamStreamString.distinct() // StreamStreamString.forEach(System.out::println); 我们可以使用flatMap来解决这种问题,像下面这样。使用flatMap方法的作用是返回的是stream中的内容而不是一个stream。 Files.lines(Paths.get(stuff.txt)).map(line - line.split(\\s)) // StreamString[].flatMap(Arrays::stream) // StreamString.distinct() // StreamString.forEach(System.out::println); collect 操作 我们来具体看一下collect操作。上面文章中看到了返回stream的操作说明该操作是一个中间操作和返回一个值、boolean型值、int型值和Optional型值的操作说明该操作是终结操作 。 将Stream中的元素转化到集合中. 使用toSet()你可以把一个stream转化成一个不包含重复项的集合。下面的代码展示了怎么生成高消费单笔交易1000$城市的集合。 SetString cities transactions.stream().filter(t - t.getValue() 1000).map(Transaction::getCity).collect(toSet()); 注意这样你不能保证返回什么类型的Set你可以使用toCollection()来提高可控性。比如你可以像下面代码这样将一个HashSet的构造方法作为参数。 SetString cities transactions.stream().filter(t - t.getValue() 1000).map(Transaction::getCity).collect(toCollection(HashSet::new)); collect操作方法不止这些上面介绍的只是很小一部分还可以实现这些功能 通过货币类型进行分组计算各种获取类型的交易总金额将会返回一个 MapCurrency, Integer 将所有交易分类两组大金额的和非大金额的将会返回一个MapBoolean, List 创建多级分组比如先根据城市分组然后再根据是否为大金额交易分组 将会返回一个MapString, MapBoolean, List 让我们看一下Stream API和集合器怎么实现这些查询我们先对一个stream中的数据进行计算平均值最大值和最小值。接下来我们再看如果实现简单的分组最后我们我们将多个集合器放在一起实现强大的查询功能比如多级分组。 Summarizing 有很多预定义的集合器和是很方便的使用比如使用counting() 计算个数 long howManyTransactions transactions.stream().collect(counting()); 你可以对Double, Int, 或者Long属性的元素进行 summing Double(), summingInt(), and summingLong() 操作像下面这样 int totalValue transactions.stream().collect(summingInt(Transaction::getValue)); 类似的你还可以使用averagingDouble(), averagingInt(), and averagingLong() 计算平均值像下面这样 double average transactions.stream().collect(averagingInt(Transaction::getValue)); 还可以通过使用maxBy()和minBy()计算元素中的最大值和最小值不过你需要定义一个做比较的 比较器所以maxBy和minBy需要一个Comparator对象最为参数 下面的例子中我们使用了静态方法comparing()它将根据传递进去的参数生成一个Comparator对象。这个方法根据提取stream中元素的可以做比较的key来做判断。在这个例子中是通过银行交易的金额大小来做比较的。 OptionalTransaction highestTransaction transactions.stream().collect(maxBy(comparing(Transaction::getValue))); 还有一个叫reducing()的集合器它可以通过重复地对stream中的所有元素进行一种操作指导产生一个结果。它和reduce()有点类似。比如下面的代码使用reducing()方法计算交易的总金额。 int totalValue transactions.stream().collect(reducing(0, Transaction::getValue, Integer::sum)); reducing() 有三个参数 初始值如果stream是空也将返回该值这里是0一个会被应用到各个元素的方法结合两个提取出来的值这是是将两个值加起来 Grouping 一个常规的数据库操作就是根据一个属性对数据进行分组。比如根据货币对交易进行分组如果使用迭代那简直太复杂了 MapCurrency, ListTransaction transactionsByCurrencies new HashMap();for(Transaction transaction : transactions) { Currency currency transaction.getCurrency();ListTransaction transactionsForCurrency transactionsByCurrencies.get(currency);if (transactionsForCurrency null) {transactionsForCurrency new ArrayList();transactionsByCurrencies.put(currency, transactionsForCurrency);}transactionsForCurrency.add(transaction); } Java 8 中有一个叫 groupingBy() 的集合器我们可以像这样做查询 groupingBy() 方法有一个提取分类key的函数做参数我们可以叫它为分类函数。在这个例子中我们使用的是Transaction::getCurrency来实现根据货币分组。 MapCurrency, ListTransaction transactionsByCurrencies transactions.stream().collect(groupingBy(Transaction::getCurrency)); Partitioning 还有一个叫做partitioningBy()的函数这个可以看做是groupingBy()的特例。它需要一个predicate返回一个boolean的函数作为参数将会对stream中的元素根据是否满足predicate进行分类。partitioning可以将stream变成一个 MapBoolean, List。使用代码如下 MapBoolean, ListTransaction partitionedTransactions transactions.stream().collect(partitioningBy( t - t.getValue() 1000)); 如果要要对不同货币的金额进行求和操作在SQL中可以结合使用SUM和GROUP BY。那我们使用Stream API也能这么做吗当然可以了像下面这样使用 之前使用的groupingBy (Transaction::getCity)其实是groupingBy (Transaction::getCity, toList())的速写方式。 MapString, Integer cityToSum transactions.stream().collect(groupingBy(Transaction::getCity, summingInt(Transaction::getValue))); 再看一个例子如果你要统计每个城市的交易最大值可以做这样实现 MapString, OptionalTransaction cityToHighestTransaction transactions.stream().collect(groupingBy(Transaction::getCity, maxBy(comparing(Transaction::getValue)))); 再看一个更加复杂的例子在刚才的例子中我们给groupingBy传递了另外一个集合器作为参数来进一步对元素进行分组。由于groupingBy本身是一个集合器我们可以通过传递其他groupingBy集合器来创建多级分组被传递进来的这个groupingBy定义了一个二级标准可以对stream中的元素进行再分组。 下面代码中我们先对城市进行分组然后我们再根据每个城市的交易不同货币的平均值进行分组 MapString, MapCurrency, Double cityByCurrencyToAverage transactions.stream().collect(groupingBy(Transaction::getCity,groupingBy(Transaction::getCurrency, averagingInt(Transaction::getValue)))); 自定义集合器 我们看到的这些集合器都实现了 java.util.stream .Collector 接口。这就意味着你可以自定义集合器。 总结 这篇文章中我们探索了两个Stream API的高级操作flatMap和colelct。通过这两个操作你可以创建更加复杂的数据处理查询。 我们还通过collect方法实现了summarizing, grouping, 和 partitioning 操作。这些操作还可以被结合起来创建更加复杂的查询。
http://www.huolong8.cn/news/356077/

相关文章:

  • 大学网站建设管理办法信息化flash网站模板下载
  • 谷歌浏览器app下载安装济南seo优化公司
  • 西安网站建设 中讯创赢网站建设上海站霸
  • 四川省住房和建设厅官方网站网站建设有几种方式
  • 网站改版 优势内容营销什么意思
  • 网站仿站是啥网站建设亇金手指排名十五
  • 凡客诚品售后无锡优化网站
  • 江门seo网站推广动态广告图片在线制作
  • 重庆梁平网站建设哪家好seo搜索优化待遇
  • 网站平台开发与应用面试提升关键词排名seo软件
  • 已有网站怎么修改网站建设酷万网络
  • 公司制作网站多少钱江苏交通厅门户网站建设工程
  • 网站建设管理工作简述民法典建设工程施工合同
  • 个人类网站有哪些全球速卖通
  • flashfxp上传多个网站建设银行南通城区网站
  • 广州网站建设比较好的公司牵牛建站
  • 如何自己建设电商网站莱芜都市网交友征婚
  • html5教育网站东营网站优化
  • 三亚哪些行业适合做seo
  • 免费简单门户网站开发外贸公司用的采购储运财务软件
  • 兼职做猎头的网站启东做网站
  • 新乡百度网站推广工具温州15000 做网站的工作
  • 做公司网站有什么需要注意的wordpress数据库分表
  • 商丘专业做网站公司asp.net网站开发实例教程 下载
  • 佛山网站设计建设id注册网站
  • 做本地旅游网站网站app下载平台怎么做的
  • 朝阳建设工程外贸网站建设和seo
  • 网站建设seo方案做网站好还是做程序员好
  • 可以做外贸私单的网站免费wordpress云服务器
  • 保定模板建站哪家好wordpress图片上传后无法显示