Lists,Maps等中的groupBy方法在函数后生成Map.
有没有办法使用groupBy生成一个保留插入顺序的Map(例如LinkedHashMap)?
我正在使用for循环手动插入,但我想知道一个有用的已定义函数是否可以帮助我.
提前致谢.
我有一个课程,将字符串视为一个集合.这是课程中的两种方法:
@Override
public <B> IndexedSeq<B> map(final Function1<? super Character, B> function) {...}
public RichString map(final Function1<? super Character, Character> function) {...}
Run Code Online (Sandbox Code Playgroud)
只是方法的签名与我的问题相关.现在,Eclipse确实发出警告,表明这两种方法具有相同的擦除功能.但它仍然允许我创建它们,并且它们按预期工作:每当我提供将Character转换为Character的函数时,就会返回RichString,如我所愿.
我的问题是它为什么有用,因为在运行时没有关于泛型类型的信息,并且方法的返回不是方法签名的一部分?当我调用它们时,JVM如何知道调用这两种方法中的哪一种?
编辑:
我认为,在擦除之后,这两种方法将具有以下特征:
@Override
public IndexedSeq map(final Function1<Object, Object> function) {...}
public RichString map(final Function1<Object, Object> function) {...}
Run Code Online (Sandbox Code Playgroud)
这会使它们的区别仅在于返回类型.
在Scala中,可以使用注释@BeanProperty自动为字段生成getter和setter.
如何创建自己的注释?
我有兴趣创建更改源代码的注释,就像@BeanProperty一样.
作为示例,我如何创建仅生成get方法的注释?
谢谢.
我是函数式编程的新手,因此使用函数式方法解决一些问题似乎更难.
假设我有一个数字列表,例如1到10.000,我想得到列表中最多总数为n的项目(假设为100).因此,它会得到数字,直到它们的总和大于100.
在命令式编程中,解决这个问题是微不足道的,因为我可以在每次交互中保留一个变量,并在达到目标后停止.
但是我怎么能在函数式编程中做同样的事情呢?由于sum函数在已完成的列表上运行,而我仍然没有完成的列表,我怎样才能"继续"计算?
如果sum是懒惰计算的,我可以这样写:
(1 to 10000).sum.takeWhile(_ < 100)
Run Code Online (Sandbox Code Playgroud)
PS:即使任何答案都会受到赞赏,我也希望每次都能计算出一个总和,因为显然命令式版本在速度方面会更加优化.
编辑:
我知道我可以将命令式循环方法"转换"为功能递归函数.我更感兴趣的是找到一个现有的库函数是否可以为我提供一种方法,让我不需要每次需要时都写一个.
我有以下代码从数据生成pdf:
<p:barchart is3D="true" legend="false" orientation="horizontal" width="520">
<p:series key="Gráfico">
<ui:repeat var="ocr" value="#{myBean.value}" >
<p:data key="#{ocr[0]}" value="#{ocr[1]}" />
</ui:repeat>
</p:series>
</p:barchart>
Run Code Online (Sandbox Code Playgroud)
问题是来自p:data的密钥与右边对齐(出于某种奇怪的原因).我尝试使用text-align将代码放在div之间,但它没有用.
我希望对齐位于左侧.
如果有人有答案,或者至少有一个让我尝试的想法,我真的很感激.
提前致谢.
我正在玩Java中的泛型,我发现了一些奇怪的东西:
以下编译:
public static <A, B extends A> B reduce(Function2<A, A, B> func)
{
//code doesn't matter
}
Run Code Online (Sandbox Code Playgroud)
但以下不是:
public static <A, B super A> B reduce(Function2<A, A, B> func)
{
//code doesn't matter
}
Run Code Online (Sandbox Code Playgroud)
在我看来上面是完全有效的(毕竟,这几乎是Scala集合中reduce方法的签名).
为什么Java不允许逆变返回类型,特别是在这种情况下,因为将推断返回(通过Function2的第三个参数)?
在编写欧拉问题时,我碰到了我认为奇怪的事情:
toString.map方法比toString.toArray.map慢.
这是一个例子:
def main(args: Array[String])
{
def toDigit(num : Int) = num.toString.map(_ - 48) //2137 ms
def toDigitFast(num : Int) = num.toString.toArray.map(_ - 48) //592 ms
val startTime = System.currentTimeMillis;
(1 to 1200000).map(toDigit)
println(System.currentTimeMillis - startTime)
}
Run Code Online (Sandbox Code Playgroud)
字符串上的方法映射不应该回退到数组上的映射吗?为什么会出现如此显着的差异?(注意,增加数量甚至会导致非阵列情况下的堆栈溢出).
在Scala中,可以在构造函数中定义类属性.但是一旦你在那里声明它们,就不可能改变行为(getter和setter),就像你在类体中声明一样?
例:
class MyExample(var attribute : String)
{
def attribute() //trying to override getter <- doesn't work
}
class MyExample(theAttribute : String)
{
def attribute = theAttribute //overriding default accessor (was var)
}
Run Code Online (Sandbox Code Playgroud)
如果不可能,为什么会这样呢?当你向人们展示他们可以通过在构造函数中设置var或val来轻松创建属性而不关心getter和setter(他们可以根据需要改变)时,这似乎令人困惑,最终发现,事实上,你应该避免使用那些一种便利.
scala ×5
generics ×2
java ×2
annotations ×1
attributes ×1
class ×1
collections ×1
constructor ×1
hashmap ×1
jvm ×1
map ×1
methods ×1
pdf ×1
performance ×1
seam ×1
string ×1