GVKun编程网logo

Java 8是否缺少OptionalBoolean?(缺少javadoc)

5

在本文中,我们将详细介绍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)

Java 8是否缺少OptionalBoolean?(缺少javadoc)

作为一种原始的版本Optional*,爪哇1.8提供OptionalIntOptionalLongOptionalDouble

但是我找不到等效的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)区别

Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别

在Java中,我们经常会将 String 类型的"true"或"false"转化为 boolean 类型的 truefalse ;除强制类型转化实现以外,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") 的结果有些意外,我最初以为这三个方法只是内部实现不一样,结果应该是一样的,看来之前的想法是错的,打开源码看一下:

  1. 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 类型的 truefalse,用这个方法将是最佳的选择。

  1. 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)会更好一些。

  1. 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语法中

c – boost :: optional to bool,在boost :: spirit :: qi语法中

在我的boost :: spirit语法中,我有以下片段;
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.

我将如何实现这一目标?

解决方法

我想你正在寻找qi :: matches []:
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?

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;
}

解决方法

从属表中仍有一个从属对象在masterId列中没有设置值.

尝试使用ctx.DeleteObject(newSlave)来摆脱它.

could not change active booleans:Inalid boolean

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等更多相关知识的信息可以在本站进行查询。

本文标签: