查询的技巧和模式?

时间:2013-12-29 21:53:16

标签: c# java algorithm linq time-complexity

我从C#开始,现在我将使用Java。我需要在Java中实现一个简单的linq查询(filter + get)。

C#等价物可以是:

public interface IPriceRule
{
    bool IsMatch(OrderItem item);
    decimal CalculatePrice(OrderItem item);
}
//
_pricingRules = new List<IPriceRule>();
//...
public decimal CalculatePrice(OrderItem item)
{
    return _pricingRules.First(r => r.IsMatch(item)).CalculatePrice(item);
}

知道java没有Linq,我遇到的第一件事就是扩展方法,但也不存在。 然后我必须做所有(也许我因为简单而导致坏习惯)

@Override
public BigDecimal CalculatePrice(OrderItem item) {
    IPriceRule _selectedRule = getFirstItemThatMatch(_pricingRules, item);
    if(_selectedRule != null)
        return _selectedRule.CalculatePrice(item);
    else
        return BigDecimal.ZERO;
}

private IPriceRule getFirstItemThatMatch(List<IPriceRule> prmCollection, OrderItem item) {
    IPriceRule _result = null;
    for(IPriceRule itemPriceRule : prmCollection) {
        if(itemPriceRule.IsMatch(item)) {
            _result = itemPriceRule;
            break;
        }
    }
    return _result;
}

我不相信这个java代码是等价的,最优的。也许存在一种在算法复杂度和编码速度方面优化和改进它的技术。

我相信 .net优化并规范化查询并使用linq将其带给您,与您可以编写的代码进行比较。

2 个答案:

答案 0 :(得分:1)

如您所知,LINQ不支持Java(reference)。

但您可以将任何ORM用于数据库层作为Hibernate / JPA。在.NET中,我使用了nHibernate,它相当于Java中的hibernate(所以我很容易下载)。

但LINQ不是ORM(抽象类),所以你不会有完整的玻璃。

答案 1 :(得分:0)

松散地说,我猜你需要考虑在Java中使用一些ORM。 例如,Hibernate或Entity EJB或JPA。这些是 在某种程度上类似于C#的LINQ to SQL。你不需要这样做 这一切都是用Java自己做的。 Java和Java都有所不同 在这方面提供更多恕我直言......如果你只是在寻找 一般来说,lambda表达式可以检查一下。

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

但似乎只有Java 8才能使用lambda表达式。