在本文中,我们将详细介绍Java8是否缺少OptionalBoolean?的各个方面,并为您提供关于缺少javadoc的相关解答,同时,我们也将为您带来关于Boolean的parseBoolean(s
在本文中,我们将详细介绍Java 8是否缺少OptionalBoolean?的各个方面,并为您提供关于缺少javadoc的相关解答,同时,我们也将为您带来关于Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别、c – boost :: optional to bool,在boost :: spirit :: qi语法中、c# – 为什么EntityCollection.Remove()会导致SaveChanges()引发InvalidOperationException?、could not change active booleans:Inalid boolean的有用知识。
本文目录一览:- Java 8是否缺少OptionalBoolean?(缺少javadoc)
- Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别
- c – boost :: optional to bool,在boost :: spirit :: qi语法中
- c# – 为什么EntityCollection.Remove()会导致SaveChanges()引发InvalidOperationException?
- could not change active booleans:Inalid boolean
Java 8是否缺少OptionalBoolean?(缺少javadoc)
作为一种原始的版本Optional
*,爪哇1.8提供OptionalInt
,OptionalLong
和OptionalDouble
。
但是我找不到等效的OptionalBoolean
类。
有什么技术上的理由反对OptionalBoolean
吗?
- 一个
Optional
可以或可以不具有一个值的情况下,使用作为替代null
。
答案1
小编典典该引用解释了使用原始流背后的注意事项。我假设同样适用于原始Optionals。简而言之,出于性能原因,创建了原始流(可能还包括Optionals)。他们没有为所有8种原始类型创建它们,以减少代码重复和接口污染。
在lambda邮件列表中引用Brian Goetz的话:
更笼统地说:拥有专门的原始流(例如IntStream)背后的哲学充满了令人讨厌的折衷。一方面,这有很多丑陋的代码重复,接口污染等。另一方面,盒装操作上的任何一种算法都糟透了,没有减少整数的故事会很糟糕。因此,我们处在艰难的境地,我们正在努力不使其变得更糟。
不使情况变得更糟的第一招是:我们没有做所有八种原始类型。我们正在做int,long和double;所有其他的都可以用这些来模拟。可以说我们也可以摆脱int,但是我们认为大多数Java开发人员都不准备为此做好准备。是的,将会有针对性格的呼吁,而答案是“将其粘贴在一个整数中”。(每个专业化项目预计将占用JRE约100K的空间。)
技巧2:我们正在使用原始流来公开在原始域中最好完成的事情(排序,归约),而不是尝试复制盒装域中可以做的所有事情。例如,正如Aleksey指出的那样,没有IntStream.into()。(如果有,下一个问题将是“
IntCollection在哪里?IntArrayList?IntConcurrentSkipListMap?”。)意图是许多流可能以引用流开始,最终以原始流结束,但是反之则不然。减少了所需的转换次数(例如,对于int->
T,没有映射重载;对于int-> T,没有函数的特殊化,等等)
我要提到的是,我在这个问题的答案中找到了这句话。
Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别
在Java中,我们经常会将 String
类型的"true"或"false"转化为 boolean
类型的 true
或 false
;除强制类型转化实现以外,Java还提供了 Boolean.parseBoolean(s)
、 Boolean.valueOf(s)
和 Boolean.getBoolean(s)
三个方法,这个两三个方法是一样的吗?可以做一个简单的测试:
public static void main(String[] args) {
boolean b1 = Boolean.parseBoolean("true");
System.out.println("b1=" + b1);//b1=true
b1 = Boolean.parseBoolean("false");
System.out.println("b1=" + b1);//b1=false
boolean b2 = Boolean.valueOf("true");
System.out.println("b2=" + b2);//b2=true
b2 = Boolean.valueOf("false");
System.out.println("b2=" + b2);//b2=false
boolean b3 = Boolean.getBoolean("true");
System.out.println("b3=" + b3);//b3=false
b3 = Boolean.getBoolean("false");
System.out.println("b3=" + b3);//b3=false
}
上面这个简单的测试,Boolean.parseBoolean(s)
和 Boolean.valueOf(s)
结果都是预期的,但是 Boolean.getBoolean("true")
的结果有些意外,我最初以为这三个方法只是内部实现不一样,结果应该是一样的,看来之前的想法是错的,打开源码看一下:
Boolean.parseBoolean(s)
的源码:
public static boolean parseBoolean(String s) {
return toBoolean(s);
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
从源码不难看出,当传入不区分大小写的字符串"true"时,都能得到 true
的返回,当传入"true"之外的字符串或null时,都将返回false
;根据源码可以确信,将 String
类型的"true"或"false"转化为 boolean
类型的 true
或 false
,用这个方法将是最佳的选择。
Boolean.valueOf(s)
的源码:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
从源码可以看到,底层实现和 Boolean.parseBoolean(s)
是一样的,只是这个方法返回的是Boolean对象,是包装类型,如果要转化为boolean值的话会有一层自动拆箱的过程,只返回boolean类型值的情况下,用 Boolean.parseBoolean(s)
会更好一些。
Boolean.getBoolean(s)
的源码:
public static boolean getBoolean(String name) {
boolean result = false;
try {
result = toBoolean(System.getProperty(name));
} catch (IllegalArgumentException e) {
} catch (NullPointerException e) {
}
return result;
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
从源码可以理解到,这个方法的设计应该是为了提供一个系统属性到boolean的映射,日常代码很少使用,在一些使用场景比较特殊的情况下才会用到;我尝试在项目中查找有没有使用的这个方法的地方,在 org.quartz.core.shouldRunUpdateCheck
中找到了这个方法的使用,quartz用这个方法实现了一个定时联网检测更新的功能(这个功能引申出了另外一个quartz使用中的问题,后续总结之后再把文章链接贴到这里)。
要正确使用 Boolean.getBoolean(s)
的方式应该是如下:
System.setProperty("key", "true");
System.out.println(Boolean.getBoolean("key"));
c – boost :: optional to bool,在boost :: spirit :: qi语法中
implicit_method_declaration = (-(qi::token(ABSTRACT)) >> ...)
– (qi :: token(ABSTRACT)的类型是boost :: optional< boost :: iterator_range< std :: string :: iterator>>但是我只是使用这个构造来检查是否抽象关键字,实际上是现在,也就是说,我宁愿 – (qi :: token(ABSTRACT)的类型为bool,值为boost :: optional< ...> operator bool()const.
我将如何实现这一目标?
解决方法
implicit_method_declaration = qi::matches[qi::token(ABSTRACT)] >> ...;
另一种方法是使用qi :: attr()和替代方法:
implicit_method_declaration = ( qi::token(ABSTRACT) >> qi::attr(true) | qi::attr(false) ) >> ...;
再次快速演示:http://coliru.stacked-crooked.com/a/ed8bbad53e8c1943
#include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi; template <typename It,typename Skipper = qi::space_type> struct parser : qi::grammar<It,bool(),Skipper> { parser() : parser::base_type(implicit_method_declaration) { using namespace qi; implicit_method_declaration = matches["abstract"]; BOOST_SPIRIT_DEBUG_NODES((implicit_method_declaration)); } private: qi::rule<It,Skipper> implicit_method_declaration; }; bool doParse(const std::string& input) { typedef std::string::const_iterator It; auto f(begin(input)),l(end(input)); parser<It,qi::space_type> p; bool data; try { bool ok = qi::phrase_parse(f,l,p,qi::space,data); if (ok) { std::cout << "parse success\n"; std::cout << "data: " << data << "\n"; } else std::cerr << "parse Failed: '" << std::string(f,l) << "'\n"; if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n"; return ok; } catch(const qi::expectation_failure<It>& e) { std::string frag(e.first,e.last); std::cerr << e.what() << "'" << frag << "'\n"; } return false; } int main() { doParse("abstract"); doParse("static final"); }
产量
parse success data: 1 parse success data: 0 trailing unparsed: 'static final'
c# – 为什么EntityCollection.Remove()会导致SaveChanges()引发InvalidOperationException?
CREATE TABLE master ( id integer primary key autoincrement,title text); CREATE TABLE slave ( id integer primary key autoincrement,master_id integer not null,title text,foreign key (master_id) references master (id));
我创建了一个sqlite数据库,然后我用它来创建一个Entity Framework .edmx文件.
然后我添加一个主记录和一个奴隶记录,工作正常,然后我尝试删除从记录,但这引发了一个异常,我不知道为什么.
var ctx = new blaEntities(); var newMaster = master.Createmaster(0); ctx.masters.Addobject(newMaster); var newSlave = slave.Createslave(0,0); newMaster.slaves.Add(newSlave); ctx.SaveChanges(); // works fine,both id and master_id properties of newMaster // and newSlave are then set with generated values. newMaster.slaves.Remove(newSlave); ctx.SaveChanges(); // InvalidOperationException is raised
异常的消息是:
The operation Failed: The relationship Could not be changed because
one or more of the foreign-key properties is non-nullable. When a
change is made to a relationship,the related foreign-key property is
set to a null value. If the foreign-key does not support null values,
a new relationship must be defined,the foreign-key property must be
assigned another non-null value,or the unrelated object must be
deleted.
我究竟做错了什么?
编辑:
这是由EF Createslave(…)方法生成的:
public static slave Createslave(global::system.int64 id,global::system.int64 master_id) { slave slave = new slave(); slave.id = id; slave.master_id = master_id; return slave; }
解决方法
尝试使用ctx.DeleteObject(newSlave)来摆脱它.
could not change active booleans:Inalid boolean
could not change active booleans:Inalid boolean
[root@umboyserver vsftpd]# setsebool allow_ftpd_full_access 1
[root@umboyserver vsftpd]# setsebool allow_ftpd_use_cifs 1
[root@umboyserver vsftpd]# setsebool allow_ftpd_use_nfs 1
[root@umboyserver vsftpd]# setsebool ftp_home_dir 1
[root@umboyserver vsftpd]# setsebool httpd_enable_ftp_server 1
[root@umboyserver vsftpd]# setsebool tftp_anon_write 1
[root@umboyserver vsftpd]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@umboyserver vsftpd]# getsebool -a|grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> on
allow_ftpd_use_cifs --> on
allow_ftpd_use_nfs --> on
ftp_home_dir --> on
httpd_enable_ftp_server --> on
tftp_anon_write --> on
OK!
今天关于Java 8是否缺少OptionalBoolean?和缺少javadoc的介绍到此结束,谢谢您的阅读,有关Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别、c – boost :: optional to bool,在boost :: spirit :: qi语法中、c# – 为什么EntityCollection.Remove()会导致SaveChanges()引发InvalidOperationException?、could not change active booleans:Inalid boolean等更多相关知识的信息可以在本站进行查询。
本文标签: