在Java 8中,如何Stream通过检查每个对象的属性的清晰度来使用API 过滤集合?
例如,我有一个Person对象列表,我想删除具有相同名称的人,
persons.stream().distinct();
Run Code Online (Sandbox Code Playgroud)
将使用Person对象的默认相等检查,所以我需要像,
persons.stream().distinct(p -> p.getName());
Run Code Online (Sandbox Code Playgroud)
不幸的是,该distinct()方法没有这种过载.如果不修改类中的相等性检查,Person是否可以简洁地执行此操作?
在C#(以及许多其他语言)中,访问相同类型的其他实例的私有字段是完全合法的.例如:
public class Foo
{
private bool aBool;
public void DoBar(Foo anotherFoo)
{
if (anotherFoo.aBool) ...
}
}
Run Code Online (Sandbox Code Playgroud)
由于C#规范(第3.5.1,3.5.2节)规定对私有字段的访问属于类型,而不是实例.我一直在与同事讨论这个问题,我们试图找出它之所以如此工作的原因(而不是限制对同一个实例的访问).
我们可以提出的最佳参数是进行相等性检查,其中类可能希望访问私有字段以确定与另一个实例的相等性.还有其他原因吗?或者一些绝对意味着它必须像这样或某种东西工作的黄金理由是完全不可能的?
我讨厌EventHandler.sender如果我想用它做什么,我讨厌我必须施展.我讨厌我必须创建一个继承EventArgs使用的新类EventHandler<T>.
我总是被告知这EventHandler是传统和啰嗦,等等......无论如何.但我找不到这个教条仍然存在的原因.
有一个原因,为什么建立一个新的代表是一个坏主意:
delegate void EventHandler<TSender, T>(TSender sender, T args);
Run Code Online (Sandbox Code Playgroud)
这样sender将是类型安全的,我可以传递我想要的任何东西作为参数(如果我愿意,包括自定义EventArgs).
我有一个包含多个构造函数的数据类型,我需要AutoFixture来选择最贪婪的(一个参数最多的).默认行为是选择编号最小的构造函数.
作者的博客文章http://blog.ploeh.dk/2009/03/24/HowAutoFixtureCreatesObjects.aspx似乎并不意味着有一种方法可以覆盖这种行为,所以它是否可能,如果是这样,如何?
我有一个名为Item的类.Item有一个名为ItemCode的标识符属性,它是一个字符串.我想得到一个项目列表中所有非不同项目的列表.
例:
List<Item> itemList = new List<Item>()
{
new Item("code1", "description1"),
new Item("code2", "description2"),
new Item("code2", "description3"),
};
Run Code Online (Sandbox Code Playgroud)
我想要一个包含最下面两个条目的列表
如果我使用
var distinctItems = itemsList.Distinct();
Run Code Online (Sandbox Code Playgroud)
我得到了很棒的不同物品清单,但我想要几乎与此相反.我可以从原始列表中减去不同的列表,但不包含所有重复,只包含每个重复的一个实例.
我有一个游戏,无法找到一个优雅的解决方案.任何指针或帮助将非常感激.谢谢!
我有3.5所以LINQ可用
查看以下代码:
private void Foo(object bar)
{
Type type = bar.GetType();
if (type != null) // Expression is always true
{
}
}
Run Code Online (Sandbox Code Playgroud)
Resharper声称type永远不会null.这对我来说很明显,因为总会有类型bar,但Resharper如何知道?怎么知道方法的结果永远不会null.
Type不是一个结构,所以它不可能.如果方法是由我编写的,那么返回值当然可以是null(不一定是GetType,而是其他东西).
Resharper是否足够聪明,只知道那个特定的方法结果永远不会是null?(就像有一个已知的.Net方法的硬编码列表,永远不会返回null)
(我会自己检查一下,但我没有VS2010(还))
假设我有2个基本接口:
IBaseModelInterface
IBaseViewInterface
Run Code Online (Sandbox Code Playgroud)
和2个接口实现这些:
ISubModelInterface : IBaseModelInterface
ISubViewInterface : IBaseViewInterface
Run Code Online (Sandbox Code Playgroud)
如果我定义一个Tuple<IBaseModelInterface, IBaseViewInterface>我想根据返回的工厂的结果设置它Tuple<ISubModelInterface, ISubViewInterface>.
在C#3中,即使子接口实现了基本接口,我也无法做到这一点.我非常确定C#4允许我这样做,IEnumerable<IBaseModelInterface>因为我现在使用in关键字来定义协方差.因此,没有Tuple让我这样做呢?
从我(小)我理解,协方差只允许在接口上,所以这是否意味着需要一个ITuple<T1, T2>接口?这存在吗?
执行Enumerable.AsEnumerable<T>(this IEnumerable<T> source)简单的回报source.但是Observable.AsObservable<T>(this IObservable<T> source)返回AnonymousObservable<T>订阅源而不是简单地返回源.
我理解这些方法对于在单个查询中更改monad非常有用(从IQueryable => IEnumerable).那么为什么实现会有所不同呢?
该Observable版本更具防御性,因为你无法将其转换为某种已知类型(如果原始版本被实现为Subject<T>你永远无法将其强制转换).那么为什么Enumerable版本没有做类似的事情呢?如果我的基本类型是一个List<T>,但因为它暴露IEnumerable<T>通过AsEnumerable,将有可能投回List<T>.
请注意,这不是关于如何暴露出的问题IEnumerable<T>而不能够施展到底层,但为什么之间的实现Enumerable和Observable在语义上是不同的.
可能重复:同时
将对象转换为两个接口,以调用泛型方法
我很确定你不能这样做所以我想知道是否有一个解决方法,但我需要/想要一个对象来表示多个接口以用于泛型约束.例如:
public void Foo<T>(T t) where T : IInterfaceA, IInterfaceB
{
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个对象,我想说出类似的话var t = (IInterfaceA | IInterfaceB)someObj;,我可以t转入这个方法.
这样做有一种漂亮的方式吗?我正在使用C#3.5,因此没有动态可用,但如果有可能动态请将其发布.
如果一个对象IDisposable在C#中实现,则可以写入
using(DisposableFoo foo = new DisposableFoo())
Run Code Online (Sandbox Code Playgroud)
我一直想知道为什么using看起来像C#关键字,但需要在.Net框架中定义的接口.是using关键字(在这种情况下,显然是用于定义库导入),还是Microsoft在Visual Studio/.Net框架中重载了它?我不希望C#关键字依赖于库.
c# ×9
generics ×2
linq ×2
.net ×1
autofixture ×1
casting ×1
collections ×1
covariance ×1
idisposable ×1
ienumerable ×1
java ×1
java-8 ×1
java-stream ×1
oop ×1
resharper ×1
tuples ×1