LINQ:进阶 - LINQ 标准查询操作概述

  “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法。大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> 接口或 IQueryable<T> 接口。标准查询运算符提供了包括筛选、投影、聚合、排序等功能在内的查询功能。  

     各个标准查询运算符在执行时间上有所不同,具体情况取决于它们是返回单一值还是值序列。返回单一值的方法(例如 Average 和 Sum)会立即执行。返回序列的方法会延迟查询执行,并返回一个可枚举的对象。  

     对于在内存中集合上运行的方法(即扩展 IEnumerable<T> 的方法),返回的可枚举对象将捕获传递到方法的参数。在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。  

     与之相反,扩展 IQueryable<T> 的方法不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树。查询处理由源 IQueryable<T> 对象处理。

 

一、按标准执行方式分类

     标准查询运算符方法的 LINQ to Objects 实现采用两种主要方式之一来执行:立即执行延迟执行。采用延迟执行的查询运算符可以进一步分为两类:流式非流式

     

     1.执行方式

          (1)立即: 立即执行意味着在代码中声明查询的位置读取数据源并执行运算。  返回单个不可枚举的结果的所有标准查询运算符都立即执行

          (2)延迟: 延迟执行意味着不在代码中声明查询的位置执行运算。  仅当对查询变量进行枚举操作时才执行运算,例如通过使用 foreach 语句。这意味着查询的执行结果取决于执行查询而非定义查询时的数据源内容。如果多次枚举查询变量,则每次结果可能都不同。几乎所有返回类型为 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的标准查询运算符都以延迟方式执行。 

           采用延迟执行方式的查询运算符可以另外分类为流式非流式

          ①流式运算符不需要在生成元素前读取所有源数据。在执行时,流式运算符一边读取每个源元素,一边对该源元素执行运算,并在可行时生成元素。流式运算符将持续读取源元素直到可以生成结果元素。这意味着可能要读取多个源元素才能生成一个结果元素。

          ②非流式运算符必须读取所有源数据才能生成结果元素。诸如排序分组等运算属于此类别。在执行时,非流式查询运算符读取所有源数据,将其放入数据结构中,执行运算,然后生成结果元素。

 

二、排列数据

     排序操作按一个或多个特性对序列的元素进行排序。第一个排序条件对元素执行主要排序。通过指定第二个排序条件,可以对各个主要排序组中的元素进行排序。 

     下图演示对一个字符序列执行按字母排序操作的结果。

  

 

标准查询运算符操作方法 - 排序
方法名说明C# 查询表达式语法
OrderBy按升序对值进行排序。orderby
OrderByDescending按降序对值进行排序。orderby … descending
ThenBy按升序执行次要排序。orderby …, …
ThenByDescending按降序执行次要排序。orderby …, … descending
Reverse颠倒集合中的元素的顺序。X

下面通过演示使用 orderby 进行升序排序:按字符串长度

var words = new[] { "the", "quick", "brown", "fox", "jumps" };

var query = from word in words

                   orderby word.Length

                   select word;


foreach (var word in query)

{

    Console.WriteLine(word);

}



下面通过演示使用 orderby descending 进行降序排序:按字符串的第一个字母

var words = new[] { "the", "quick", "brown", "fox", "jumps" };

var query = from word in words

                   orderby word.Substring(0,1) descending 

                   select word;


foreach (var word in query)

{

    Console.WriteLine(word);

}

下面通过演示使用 orderby 进行主要和次要排序:先升序按字符串长度(主)、再升序按字符串的第一个字母(次)

var words = new[] { "the", "quick", "brown", "fox", "jumps" };

var query = from word in words

                   orderby word.Length, word.Substring(0, 1)

                   select word;


foreach (var word in query)

{

    Console.WriteLine(word);

}

下面通过演示使用 orderby descending 进行主要和次要排序:先升序按字符串长度(主)、再降序按字符串的第一个字母(次)

var words = new[] { "the", "quick", "brown", "fox", "jumps" };

var query = from word in words

                   orderby word.Length, word.Substring(0, 1) descending 

                   select word;


foreach (var word in query)

{

    Console.WriteLine(word);

}

 

三、Set 操作

  LINQ 中的 Set 操作是指根据相同或不同集合中是否存在等效元素来生成结果集的查询操作

 

标准查询运算符操作方法 - Set
方法名说明

C# 查询表达式语法

Distinct

从集合移除重复值。

X

Except

返回差集,差集是指位于一个集合但不位于另一个集合的元素。

X

Intersect

返回交集,交集是指同时出现在两个集合中的元素。

X

Union

返回并集,并集是指位于两个集合中任一集合的唯一的元素。

X

 

  图解 Set 操作

  (1)Distinct: 返回的序列包含输入序列的唯一元素。

  (2)Except: 返回的序列只包含位于第一个输入序列但不位于第二个输入序列的元素。  

  (3)Intersect: 返回的序列包含两个输入序列共有的元素。  

  (4)Union: 返回的序列包含两个输入序列的唯一的元素。 


 

 四、过滤数据

     筛选指将结果集限制为只包含某些满足指定条件的元素的操作。它又称为选择

     下图演示了对字符序列进行筛选的结果。筛选操作的谓词指定字符必须为“A”。

 

标准查询运算符操作方法 - 筛选
方法名说明C# 查询表达式语法
OfType根据值强制转换为指定类型的能力选择值。X
Where选择基于谓词函数的值。where

五、量词操作 

  限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。

     下图描述了两个不同源序列上的两个不同限定符运算。第一个运算询问是否有一个或多个元素为字符“A”,结果为 true。第二个运算询问是否所有元素都为字符“A”,结果为 true。  

 


标准查询运算符操作方法 - 量词

方法名

说明

C# 查询表达式语法

All

确定是否序列中的所有元素都满足条件。

X
Any

确定序列中是否有元素满足条件。

X

Contains

确定序列是否包含指定的元素。

X

 

六、投影操作

      投影是指将对象转换为一种新形式的操作,该形式通常只包含那些将随后使用的属性。通过使用投影,您可以构建依据每个对象生成的新类型。您可以映射属性,并对该属性执行数学函数。还可以在不更改原始对象的情况下映射该对象。

 

标准查询运算符操作方法 - 投影
方法名说明C# 查询表达式语法
Select映射基于转换函数的值。select
SelectMany映射基于转换函数的值序列,然后将它们展平为一个序列。使用多个 from 子句

Select:下面的示例使用 select 子句来映射字符串列表中每个字符串的第一个字母

var words = new[] { "the", "quick", "brown", "fox", "jumps" };

var query = from word in words

                   select word.Substring(0,1);


foreach (var word in query)

{

    Console.WriteLine(word);

}


SelectMany:下面的示例使用多个 from 子句来映射字符串列表中每个字符串中的每个单词

var phrases = new List<string>() { "an apple a day", "the quick brown fox" };


var query = from phrase in phrases

                   from word in phrase.Split(' ')

                   select word;


foreach (var word in query)

{

   Console.WriteLine(word);

}

  

  Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值。Select() 为每个源值生成一个结果值。因此,总体结果是一个与源集合具有相同元素数目的集合。与之相反,SelectMany() 将生成单一总体结果,其中包含来自每个源值的串联子集合。作为参数传递到 SelectMany() 的转换函数必须为每个源值返回一个可枚举值序列。然后,SelectMany() 将串联这些可枚举序列以创建一个大的序列。

  下面两个插图演示了这两个方法的操作之间的概念性区别。在每种情况下,假定选择器(转换)函数从每个源值中选择一个由花卉数据组成的数组。

  下图描述 Select() 如何返回一个与源集合具有相同元素数目的集合。

 

  下图描述 SelectMany() 如何将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值。

 

  示例

  下面的示例比较 Select() 和 SelectMany() 的行为。代码将通过从源集合的每个花卉名称列表中提取前两项来创建一个“花束”。在此示例中,转换函数 Select 使用的“单一值”本身就是一个值集合。这需要额外的 foreach 循环,以便枚举每个子序列中的每个字符串。

static void Main(string[] args)

        {

            var bouquets = new List<Bouquet>()

            {

                new Bouquet {Flowers = new List<string> {"sunflower", "daisy", "daffodil", "larkspur"}},

                new Bouquet {Flowers = new List<string> {"tulip", "rose", "orchid"}},

                new Bouquet {Flowers = new List<string> {"gladiolis", "lily", "snapdragon", "aster", "protea"}},

                new Bouquet {Flowers = new List<string> {"larkspur", "lilac", "iris", "dahlia"}}

            };


            IEnumerable<List<string>> query1 = bouquets.Select(bq => bq.Flowers);

            IEnumerable<string> query2 = bouquets.SelectMany(bq => bq.Flowers);


            Console.WriteLine("query1 - Select():");

            foreach (IEnumerable<string> collection in query1)

            {

                foreach (var item in collection)

                {

                    Console.WriteLine(item);

                }

            }


            Console.WriteLine("\nquery2 - SelectMany():");

            foreach (var item in query2)

            {

                Console.WriteLine(item);

            }


            Console.Read();

        }


        class Bouquet

        {

            public List<string> Flowers { get; set; }

        }

 

七、划分数据

  LINQ 中的分区指的是在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中一个部分的操作。

  下图显示对一个字符序列执行三个不同的分区操作的结果。第一个操作返回序列中的前三个元素。第二个操作跳过前三个元素,返回剩余的元素。第三个操作跳过序列中的前两个元素,返回接下来的三个元素。  

 

分区序列的标准查询运算符方法

运算符名称

说明

C# 查询表达式语法

Skip

跳过序列中的指定位置之前的元素。

X

SkipWhile

基于谓词函数跳过元素,直到某元素不再满足条件。

X

Take

提取序列中的指定位置之前的元素。

X

TakeWhile

基于谓词函数提取元素,直到某元素不再满足条件。X

 

八、联接操作

  将两个数据源“联接”就是将一个数据源中的对象与另一个数据源中共享某个通用特性的对象关联起来。

  当查询所面向的数据源相互之间具有无法直接领会的关系时,联接就成为一项重要的运算。在面向对象的编程中,这可能意味着在未建模对象之间进行关联,例如对单向关系进行反向推理。下面是单向关系的一个示例:Customer 类有一个类型为 City 的属性,但 City 类没有作为 Customer 对象集合的属性。如果你具有一个 City 对象列表,并且要查找每个城市中的所有客户,则可以使用联接运算完成此项查找。  

  LINQ 框架中提供的联接方法包括 Join 和 GroupJoin。这些方法执行同等联接,即根据两个数据源的键是否相等来匹配这两个数据源的联接。(与此相较,Transact-SQL 支持除“等于”之外的联接运算符,例如“小于”运算符。)用关系数据库术语表达,就是说 Join 实现了内部联接,这种联接只返回那些在另一个数据集中具有匹配项的对象。GroupJoin 方法在关系数据库术语中没有直接的等效项,但它实现了内部联接和左外部联接的超集。左外部联接是这样一种联接:它返回第一个(左)数据源的每个元素,即使该元素在另一个数据源中没有关联元素。  

  下图显示了一个概念性视图,其中包含两个集合以及这两个集合中的包含在内部联接或左外部联接中的元素。

 

标准查询运算符操作方法 - 联接

方法名

描述

C# 查询表达式语法

Join

根据键选择器函数联接两个序列并提取值对。

join … in … on … equals …

GroupJoin

根据键选择器函数联接两个序列,并对每个元素的结果匹配项进行分组。

join … in … on … equals … into …

 

九、分组数据

  分组指将数据放入组中以便每个组中的元素共享公共特性的操作。

  下图显示了对字符序列进行分组的结果。每个组的是字符。  

 

标准查询运算符方法 - 分组

方法名

说明

C# 查询表达式语法

GroupBy

对共享公共特性的元素进行分组。  每个组都由一个 IGrouping<TKey, TElement> 对象表示。  

group … by 

- 或 -

group … by … into …

ToLookup

根据键选择器函数将元素插入到 Lookup<TKey, TElement>(一个一对多字典)中。

X

使用 group by 子句根据列表中的整数是奇数还是偶数进行分组

var numbers = new List<int>() { 35, 44, 200, 84, 3987, 4, 199, 329, 446, 208 };


IEnumerable<IGrouping<bool, int>> query = from number in numbers

                                                      group number by number % 2 == 0;


foreach (var group in query)

{

    Console.WriteLine($"{(group.Key ? "偶数" : "基数")}:");

    foreach (var i in group)

    {

        Console.WriteLine(i);

    }

}    


 

十、生成操作

  生成是指创建新的值序列

 

标准查询运算符方法 - 生成

方法名

说明

C# 查询表达式语法

DefaultIfEmpty

将空集合替换为具有默认值的单一实例集合。

X
Empty

返回空集合。

X
Range

生成包含数字序列的集合。

X

Repeat

生成包含一个重复值的集合。

X

 

十一、等值操作

  如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等。

 

 

标准查询运算符方法 - 等值
方法名说明C# 查询表达式语法
SequenceEqual通过成对地比较元素确定两个序列是否相等。X

 

 十二、元素操作

  元素操作从一个序列返回单个特定元素

 

标准查询运算符操作方法 - 元素 

方法名

说明

C# 查询表达式语法

ElementAt

返回集合中指定索引处的元素。

X

ElementAtOrDefault

返回集合中指定索引处的元素;如果索引超出范围,则返回默认值。

X

First

返回集合中的第一个元素或满足条件的第一个元素。

X

FirstOrDefault

返回集合中的第一个元素或满足条件的第一个元素。  如果没有这样的元素,则返回默认值。  

X
Last

返回集合中的最后一个元素或满足条件的最后一个元素。

X

LastOrDefault

返回集合中的最后一个元素或满足条件的最后一个元素。  如果没有这样的元素,则返回默认值。  

X

Single

返回集合中的唯一元素或满足条件的唯一元素。

X

SingleOrDefault

返回集合中的唯一元素或满足条件的唯一元素。  如果没有这样的元素或集合不是正好包含一个元素,则返回默认值。  

X

 

十三、转换数据类型

  转换方法更改输入对象的类型

  LINQ 查询中的转换运算可用于各种应用程序。下面是一些示例:

  (1)Enumerable.AsEnumerable<TSource> 方法可用于隐藏类型的标准查询运算符的自定义实现。

  (2)Enumerable.OfType<TResult> 方法可用于启用非参数化集合以进行 LINQ 查询。

  (3)Enumerable.ToArray<TSource>、Enumerable.ToDictionary<TSource, TKey>、Enumerable.ToList<TSource> 和Enumerable.ToLookup<TSource, TKey> 方法可用于强制立即执行查询,而非推迟到枚举查询时。

 

标准查询运算符方法 - 转换数据类型
方法名说明C# 查询表达式语法
AsEnumerable返回类型为 IEnumerable<T> 的输入。X
AsQueryable将(泛型)IEnumerable 转换为(泛型)IQueryable。X
Cast将集合的元素强制转换为指定类型。

使用显式类型化的范围变量。 例如:

from string str in words

OfType根据值强制转换为指定类型的能力筛选值。X
ToArray将集合转换为数组。 此方法强制执行查询。X
ToDictionary根据键选择器函数将元素放入 Dictionary<TKey, TValue> 中。 此方法强制执行查询。X
ToList将集合转换为 List<T>。 此方法强制执行查询。X
ToLookup根据键选择器函数将元素放入 Lookup<TKey, TElement>(一对多字典)中。 此方法强制执行查询。X

   

  示例:

static void Main(string[] args)

        {

            var plants = new Plant[]

            {

                new CarnivorousPlant {Name = "Venus Fly Trap", TrapType = "Snap Trap"},

                new CarnivorousPlant {Name = "Pitcher Plant", TrapType = "Pitfall Trap"},

                new CarnivorousPlant {Name = "Sundew", TrapType = "Flypaper Trap"},

                new CarnivorousPlant {Name = "Waterwheel Plant", TrapType = "Snap Trap"}

            };


            var query = from CarnivorousPlant plant in plants

                        where plant.TrapType == "Snap Trap"

                        select plant;


            foreach (var carnivorousPlant in query)

            {

                Console.WriteLine(carnivorousPlant.Name);

            }


            Console.Read();

        }


        class Plant

        {

            public string Name { get; set; }

        }


        class CarnivorousPlant : Plant

        {

            public string TrapType { get; set; }

        }    


使用显式类型化的范围变量将类型强制转换为子类型,然后才访问仅在此子类型中提供的成员。



仅在此子类型中提供的成员。

 

十四、串联操作

  串联是指将一个序列追加到另一个序列的运算。

  下图演示对两个字符序列执行的串联运算。

标准查询运算符操作方法 - 串联

方法名

说明

C# 查询表达式语法

Concat

串联两个序列以组成一个序列。

X

 

十五、聚合操作

  聚合运算从值集合计算单个值。从一个月的日温度值计算日平均温度就是聚合运算的一个示例。  

  下图显示了对一个数字序列执行两个不同聚合运算的结果。第一个运算对这些数字执行求和。第二个运算返回该序列中的最大值。  

 

标准查询运算符操作方法 - 聚合

方法名

说明

C# 查询表达式语法

Aggregate

对集合值执行自定义聚合运算。

X

Average

计算值集合的平均值。

X
Count

对集合中的元素进行计数,还可以仅对满足某一谓词函数的元素进行计数。

X

LongCount

对大型集合中的元素进行计数,还可以仅对满足某一谓词函数的元素进行计数。

X
Max

确定集合中的最大值。

X
Min

确定集合中的最小值。

X

Sum

计算集合中值的总和。

X

原文地址:http://www.cnblogs.com/liqingwen/p/5801249.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/328672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年日历电子版(打印版)_“温故知新”——2020年《故宫日历》(青少版)正式发布...

2020《故宫日历》(青少版)。供图2020《故宫日历》(青少版)。供图中新网北京10月28日电 (记者 冉文娟)由故宫出版社和新东方教育科技集团联合推出的2020年《故宫日历》(青少版)28日在故宫博物院正式发布。《故宫日历》是故宫博物院介绍故宫藏品、传播故宫文化的普及读物。此次故…

BufferedImage与byte[]互转

转载自 BufferedImage与byte[]互转一、需要用到的类java.awt.image.BufferedImage; javax.imageio.ImageIO; java.io.*;二、为什么要将BufferedImage转为byte数组在传输中&#xff0c;图片是不能直接传的&#xff0c;因此需要把图片变为字节数组&#xff0c;然后传输比较方便…

2016经典微小说:《轮回》

内容来源于&#xff1a;网络 多年前&#xff0c;每到清晨&#xff0c;她要送他去幼儿园前。他总是哭着对她恳求&#xff1a;“妈妈&#xff0c;我在家听话&#xff0c;我不惹你生气&#xff0c;求你别送我去幼儿园&#xff0c;我想和你在一起。” 急匆匆忙着要上班的她&#xf…

delphi dll是否可用var参数_时间序列之向量自回归(VAR)学习重点

综合整理自&#xff1a;百度文库等向量自回归介绍&#xff1a;当我们对变量是否真是外生变量的情况不自信时&#xff0c;传递函数分析的自然扩展就是均等地对待每一个变量。在双变量情况下&#xff0c;我们可以令{yt}的时间路径受序列{zt}的当期或过去的实际值的影响&#xff0…

关于TCP/IP必须知道的几个基础问题

转载自 关于TCP/IP必须知道的几个基础问题描述一下TCP三次握手的过程 接下来我们根据下面这幅图来解释一下TCP三次握手。p.s: 每个箭头代表一次握手。第一次握手 client(客户端)发送一个SYN(seqx)包给server(服务器)&#xff0c;然后“期待”server的ACK回复。p.s: seq为sequ…

升讯威微信营销系统开发实践:(3)中控服务器的设计 .Net 还是 Java?

在上一篇文章中&#xff0c;简要介绍了升讯威微信营销系统的功能设计和架构设计&#xff0c;限于篇幅只能抛砖引玉&#xff0c;从本章节开始将围绕功能的设计和架构的设计进行详细的论述。 中控服务器的设计 在上文中&#xff0c;我们谈到需要一个中控服务器&#xff0c;用来维…

Java 虚拟机部分面试题

https://www.imooc.com/article/31018?block_idtuijian_wz https://www.imooc.com/article/31018?block_idtuijian_wz https://github.com/Snailclimb/Java_Guide https://github.com/Snailclimb/Java_Guide

linux 提取cpio_15. Linux提取RPM包文件(cpio命令)详解

在讲解如何从 RPM 包中提取文件之前&#xff0c;先来系统学习一下 cpio 命令。cpio 命令用于从归档包中存入和读取文件&#xff0c;换句话说&#xff0c;cpio 命令可以从归档包中提取文件(或目录)&#xff0c;也可以将文件(或目录)复制到归档包中。归档包&#xff0c;也可称为文…

升讯威微信营销系统开发实践:(2)功能设计与架构设计

在上一篇中&#xff0c;我们详细分析了微信订阅号和服务号的区别&#xff0c;在本篇中&#xff0c;将进入正题&#xff1a;升讯威微信营销系统的功能设计及架构设计。 一、功能设计 1&#xff09;设计目标 ◇ 为微信服务号提供运营及管理所需的各种功能&#xff0c;包括微官网、…

解读分库分表中间件Sharding-JDBC

转载自 解读分库分表中间件Sharding-JDBC编者按】数据库分库分表从互联网时代开启至今&#xff0c;一直是热门话题。在NoSQL横行的今天&#xff0c;关系型数据库凭借其稳定、查询灵活、兼容等特性&#xff0c;仍被大多数公司作为首选数据库。因此&#xff0c;合理采用分库分表…

java面试设计模式

https://blog.csdn.net/yinyuehepijiu/article/details/38663843

新闻发布项目——实体类(User)

package bdqn.newsMange.entity; /*** User的实体类* author Administrator**/ public class User {private int userId;//编号private String userName;//用户名private String userPassword;//密码private String uRole;//角色public int getUserId() {return userId;}public…

js webpack 配置路径_webpack中如何设置html引入js的路径

如题所示,如果webpack这样配置var htmlWebpackPlugin require(html-webpack-plugin);const CleanWebpackPlugin require(clean-webpack-plugin);let pathsToClean [dist,];module.exports {entry: ./src/app.js,output: {path: __dirname /dist,filename: main.[chunkhash…

HTTP 报文结构

https://www.jianshu.com/p/a2c4ede32d11

Java魔法堂:URI、URL(含URL Protocol Handler)和URN

转载自 Java魔法堂&#xff1a;URI、URL&#xff08;含URL Protocol Handler&#xff09;和URN一、前言                              过去一直搞不清什么是URI什么是URL&#xff0c;现在是时候好好弄清楚它们了&#xff01;本文作为学习笔记…

升讯威微信营销系统开发教程:(1)订阅号和服务号深入分析

微信开发系列教程&#xff0c;将以一个实际的微信平台项目为案例&#xff0c;深入浅出的讲解微信开发、应用各环节的实现方案和技术细节。 原创内容&#xff0c;欢迎转载&#xff0c;转载请注明出处。 首先在第1章节中&#xff0c;我们先理清什么是订阅号&#xff0c;什么又是服…

不安装cudnn可不可以_Linux非root用户如何优雅的安装cuda和cudnn

Linux非root用户如何优雅的安装cuda和cudnn发布时间&#xff1a;2018-05-23 16:11,浏览次数&#xff1a;804, 标签&#xff1a;LinuxrootcudacudnnLinux非root用户如何优雅的安装cuda和cudnn跑深度学习模型时&#xff0c;总会遇到各种版本的问题。如深度学习框架与cuda的版本不…

如果你也会C#,那不妨了解下F#(4):了解函数及常用函数

函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算。虽然我们不需要深入了解数学函数的知识&#xff0c;但应该清楚函数式编程的基础是来自于数学。 例如数学函数f(x) x^2x&#xff0c;并没有指定返回值的类型&#xff0c;在数学函数中并不需要关心数值类型和返…

新闻发布项目——实体类(newsTb)

package bdqn.newsMange.entity;import java.util.Date;/*** 新闻的实体类* author Administrator**/ public class newsTb {private int newsID;// 编号private int categoryID;//类别编号(外键)private String summary;// 摘要private String title;//题目private String con…

Java URL协议扩展实现

转载自 Java URL协议扩展实现在信息交互系统设计中&#xff0c;不乏有自定义通讯协议设计。本章会介绍如何利用 java.net.URL 类来自定义协议。一般而言&#xff0c; URL 的格式是&#xff1a; protocol://[authority]hostname:port/resource?queryString 。 URL 类能够解析…