我有一个列表l:List[T1],目前我正在做以下事情:
myfun : T1 -> Option[T2]
val x: Option[T2] = l.map{ myfun(l) }.flatten.find(_=>true)
Run Code Online (Sandbox Code Playgroud)
该myfun函数返回None或Some,flatten抛弃所有None,并且find返回列表的第一个元素(如果有的话).
这对我来说似乎有些苛刻.我认为可能存在一些理解或类似的东西会减少浪费或更聪明.例如:我不需要如有后续的答案myfun返回任何 Some在map列表中l.
假设我使用CQL来定义此表.
CREATE TABLE songs (
id uuid PRIMARY KEY,
title text,
album text,
artist text,
tags set<text>,
data blob);
Run Code Online (Sandbox Code Playgroud)
其他开发人员(或几周后我自己)(重新)如何发现此表的布局?
我在考虑与MySQL DESCRIBE {tablename}命令相同的东西.
[编辑]
我看到DESCRIBECassandra的命令行界面(CLI)中有一个方法,但在使用它时,它声明它的结果中不包含有关CQL表的信息.
我目前正在使用Cassandra 2的Datastax Cassandra驱动程序来执行cql3.这工作正常.我开始使用PreparedStatement's:
Session session = sessionProvider.getSession();
try {
PreparedStatement ps = session.prepare(cql);
ResultSet rs = session.execute(ps.bind(objects));
if (irsr != null) {
irsr.read(rs);
}
}
Run Code Online (Sandbox Code Playgroud)
有时我会在日志中收到驱动程序的警告:
Re-preparing already prepared query . Please note that preparing the same query more than once is generally an anti-pattern and will likely affect performance. Consider preparing the statement only once.
Run Code Online (Sandbox Code Playgroud)
这个警告是有道理的,但我不确定我应该如何重用PreparedStatement?
我应该只是PreparedStatement在构造函数/ init方法中创建我的所有内容而不是简单地使用它们吗?
但是当多个线程同时使用相同的线程PreparedStatement时(特别是调用PreparedStatement.bind()绑定对象),这是否顺利
所以,我有一个看起来像这样的Scala类:
class TestClass {
var value: Option[Int] = None
}
Run Code Online (Sandbox Code Playgroud)
我正在解决一个问题,我有一个String值,我想在运行时使用反射将其强制转换为Option [Int].所以,在另一段代码中(对TestClass一无所知)我有一些这样的代码:
def setField[A <: Object](target: A, fieldName: String, value: String) {
val field = target.getClass.getDeclaredField(fieldName)
val coercedValue = ???; // How do I figure out that this needs to be Option[Int] ?
field.set(target, coercedValue)
}
Run Code Online (Sandbox Code Playgroud)
为此,我需要知道该字段是一个Option,并且Option的type参数是Int.
我可以选择在运行时(即使用反射)确定'value'的类型是Option [Int]?
我已经看到通过注释字段解决了类似的问题,例如@OptionType(Int.class).如果可能的话,我更喜欢不需要在反射目标上进行注释的解决方案.
基本上我正在寻找最像scala的方式来做以下事情:
def sum(value1: Option[Int], value2: Option[Int]): Option[Int] =
if(value1.isDefined && value2.isDefined) Some(value1.get + value2.get)
else if(value1.isDefined && value2.isEmpty) value1
else if(value1.isEmpty && value2.isDefined) value2
else None
Run Code Online (Sandbox Code Playgroud)
这给出了正确的输出:
sum(Some(5), Some(3)) // result = Some(8)
sum(Some(5), None) // result = Some(5)
sum(None, Some(3)) // result = Some(3)
sum(None, None) // result = None
Run Code Online (Sandbox Code Playgroud)
然而,总结两个以上的选项,我必须使用太多ifs或使用某种循环.
编辑-1:
在写这个问题时,我想出了一个答案:
def sum2(value1: Option[Int], value2: Option[Int]): Option[Int] =
value1.toList ::: value2.toList reduceLeftOption { _ + _ }
Run Code Online (Sandbox Code Playgroud)
这个看起来非常惯用于我没有经验的眼睛.这甚至可以使用两个以上的值.可以在不转换为列表的情况下执行相同的操作吗?
EDIT 2:
我最终得到了这个解决方案(感谢ziggystar):
def sum(values: …Run Code Online (Sandbox Code Playgroud) 我有一个Scala帮助器方法,当前尝试获取URL并返回带有该网页的HTML的Option [String].
如果有任何异常(格式错误的URL,读取超时等等)或者如果有任何问题,则返回None.问题是,抛出异常以便调用代码可以记录异常或者在这种情况下返回None是否更好?
使用带有简单选项的for循环可以:
scala> for (lst <- Some(List(1,2,3))) yield lst
res68: Option[List[Int]] = Some(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
但循环选项的内容不会:
scala> for (lst <- Some(List(1,2,3)); x <- lst) yield x
<console>:8: error: type mismatch;
found : List[Int]
required: Option[?]
for (lst <- Some(List(1,2,3)); x <- lst) yield x
^
Run Code Online (Sandbox Code Playgroud)
...除非Option明确转换为List:
scala> for (lst <- Some(List(1,2,3)).toList; x <- lst) yield x
res66: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
为什么需要显式列表转换?这是惯用的解决方案吗?
总是告诉我Java异常处理非常昂贵.
我问的是,在程序开头创建特定类型的异常实例并且不创建新的异常实例是一个好习惯,总是抛出相同的异常对象.
我只想举个例子.常用代码:
if (!checkSomething(myObject))
throw new CustomException("your object is invalid");
Run Code Online (Sandbox Code Playgroud)
替代方案:
static CustomException MYEXP = new CustomException("your object is invalid");
//somewhere else
if (!checkSomething(myObject))
throw MYEXP;
Run Code Online (Sandbox Code Playgroud)
当然,我在这里做一些假设:
MyCustomException 没有参数所以问题是:
我希望这不是一个闲置/愚蠢的问题,我对此很好奇.我认为异常处理的实际成本是处理而不是创建.
编辑 添加了关于FOSDEM演示的精确讨论的参考
免责声明:我的代码都没有像提议的那样工作,我无意管理这样的异常,我只是在做一个"假设"问题,而这种好奇心是从视频的肯定中产生的.我想:如果在Scala中完成,为什么不在Java中呢?
我有一个名为的类PageItem,它有一个带有Contextas参数的构造函数:
PageItem(Context context)
{
super(context);
this.context = context;
}
Run Code Online (Sandbox Code Playgroud)
PageItem 有这些属性:
private int id;
private String Title;
private String Description;
public Newsprovider newsprovider;
public Topic topic;
Run Code Online (Sandbox Code Playgroud)
Newsprovider并且Topic是我的应用程序的其他类,并具有以下构造函数:
Newsprovider (Context context)
{
super(context);
this.context = context;
}
Topic (Context context)
{
super(context);
this.context = context;
}
Run Code Online (Sandbox Code Playgroud)
PageItem,Newsprovider并且Topic是的子类SQLiteOpenHelper.
我想PageItem用Gson 反序列化数组,所以我写道:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PageItem.class, new PageItemInstanceCreator(context));
Gson gson = gsonBuilder.create();
Pageitem pis[] = gson.fromJson(s, …Run Code Online (Sandbox Code Playgroud) 如何在ruby中建模可选值?Scala有Option [],这是我在ruby中寻找的东西.